如何从应用程序打开 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。所以也许它会对某人有所帮助。
我正在尝试从我的应用程序打开 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。所以也许它会对某人有所帮助。