如何从应用程序打开 Pdf 到默认查看器?

How to open Pdf from application to default viewer?

我正在尝试从我的应用程序打开 pdf 到 Nougat 中的默认文档查看器。

这不是重复的,因为我遇到的问题与其他问题不同,所以请阅读到最后。

我试过的:

我知道我必须使用 FileProvider,使 provider.xml,获得有关访问该应用程序的运行时权限。

AndroidManifest.xml

 <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

我的 GenericFileProvider

public class GenericFileProvider extends FileProvider {}

provider_path.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
       <external-path name="external_files" path="."/>
</paths>

通过这个

打开 pdf
 val file = File(Environment.getExternalStorageDirectory().toString()+"pdfname")

            val intent = Intent()
            intent.action = Intent.ACTION_VIEW
            val uri = FileProvider.getUriForFile(context,  BuildConfig.APPLICATION_ID + ".provider", file)

           context.grantUriPermission("com.google.android.apps.docs", uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION)


            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

            intent.setDataAndType(uri, "application/pdf")
            context.startActivity(intent)

我的问题是:

at the time of viewing my pdf its first character has been changed . so it generates file not found exception

当我使用此提供商路径时。 它删除了我的 pdf 名称的第一个字符

 my file name is  : /storage/emulated/0on the matter of.pdf
 my uri is : content://mypackage.provider/root/storage/emulated/0on%20the%20matter%20of.pdf
so pdf name is : n the matter of.pdf

使用 provider_path 时。

<root-path
           name="root"
           path="/" />

它将 0 添加到我的 pdf 名称

 my file name is  : /storage/emulated/0on the matter of.pdf
 my uri is : content://mypackage.provider/root/storage/emulated/0on%20the%20matter%20of.pdf
so pdf name is : 0on the matter of.pdf

我应该怎么做才能正确获取 pdf 名称。我应该在提供者路径中写什么。

感谢@VladyslavMatviienko 和@greenapps。我已经解决了我的问题。

正如@VladyslavMatviienko 指出的那样。我传递了错误的文件路径。

val file = File(Environment.getExternalStorageDirectory().toString()+"pdfname")

而不是

val file = File(Environment.getExternalStorageDirectory().toString()+"/pdfname")

所以显示 java.io.FileNotFoundException:

因此,我的问题中发布的所有内容都可以很好地从我的应用程序向 Oreo 中的查看器显示 pdf。所以也许它会对某人有所帮助。