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

时间:2018-08-20 07:57:47

标签: android android-studio pdf android-7.0-nougat android-fileprovider

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

这不是重复的原因,因为我与其他人有不同的问题,所以请阅读至结束。

我尝试过的事情:

我知道我必须使用FileProvider,Make 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>

openign 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)

我的问题是:

  

在查看我的pdf时,其第一个字符已更改。   因此会生成未找到文件的异常

当我使用此提供程序路径时。 它删除了我的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 this时。

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

它为我的pdf名称添加了0

 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名称。我应该在提供程序路径中写些什么。

1 个答案:

答案 0 :(得分:0)

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

如@VladyslavMatviienko所指出。我传递的文件路径错误。

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

代替

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

因此,它表明java.io.FileNotFoundException:

因此,我的问题中发布的所有内容都可以在Oreo中向我的应用程序向查看器显示pdf正常工作。所以也许它将帮助某人。