android 11 中的 PDF 查看器权限问题
PDF viewer permission issue in android 11
我正在使用外部 pdf 查看器应用程序打开 pdf 文件。但是在 android 11 显示 eacces
权限被拒绝的问题。所有权限都已在我的清单文件中声明。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
还声明了这个:
android:requestLegacyExternalStorage="true"
使用以下代码创建和编写内容:
byte [] decodedContent = Base64.decode(base64.getBytes(), Base64.DEFAULT);
try {
File pdfDirPath = new File(getApplicationContext().getExternalFilesDir(null).getAbsolutePath(), "pdfs");
File file5 = new File(pdfDirPath, globalData.getVin()+".pdf");
if (!file5.exists()) {
file5.getParentFile().mkdirs();
}
outputStream = new FileOutputStream(file5);
outputStream.write(Base64.decode(base64, Base64.NO_WRAP));
outputStream.close();
然后像这样打开上面的文件:
Uri path = FileProvider.getUriForFile(getApplicationContext(), getApplicationContext().getPackageName() + ".helper.ProviderClass", file5);
intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(path, "application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
请帮我解决这个问题。
两分。
- android:requestLegacyExternalStorage="true" 在 Android 11 上被忽略。此版本的 Android 强制执行范围存储,而不管您的清单中的此标志如何,因此您可以安全地使用出来是因为它对您的设备没有影响。
- 由于分区存储是强制执行的,因此不允许应用访问其他应用的私有存储位置。在您的情况下,您将文件保存在 getApplicationContext().getExternalFilesDir(null).getAbsolutePath() 中,这是您应用程序的私有位置。 Android 11 的分区存储规则将禁止您的外部 PDF 查看器应用程序打开您应用程序所在位置的任何文件。
在 Android 11,如果您想让另一个应用程序打开您的应用程序创建的文档,您至少有两个选择,而且可能更多。
a) 一个复杂的。使用 FileProvider https://developer.android.com/reference/androidx/core/content/FileProvider
b) 这个要简单得多。由于您的目的是与另一个应用程序共享此文件,而不是写入您应用程序的特定目录,您应该使用 MediaStore API 并将其写入 MediaStore.Downloads.EXTERNAL_CONTENT_URI。网上有很多很好的例子,例如 How to save pdf in scoped storage?
您的 PDF 查看器应该可以从那里访问它。
我正在使用外部 pdf 查看器应用程序打开 pdf 文件。但是在 android 11 显示 eacces 权限被拒绝的问题。所有权限都已在我的清单文件中声明。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
还声明了这个:
android:requestLegacyExternalStorage="true"
使用以下代码创建和编写内容:
byte [] decodedContent = Base64.decode(base64.getBytes(), Base64.DEFAULT);
try {
File pdfDirPath = new File(getApplicationContext().getExternalFilesDir(null).getAbsolutePath(), "pdfs");
File file5 = new File(pdfDirPath, globalData.getVin()+".pdf");
if (!file5.exists()) {
file5.getParentFile().mkdirs();
}
outputStream = new FileOutputStream(file5);
outputStream.write(Base64.decode(base64, Base64.NO_WRAP));
outputStream.close();
然后像这样打开上面的文件:
Uri path = FileProvider.getUriForFile(getApplicationContext(), getApplicationContext().getPackageName() + ".helper.ProviderClass", file5);
intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(path, "application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
请帮我解决这个问题。
两分。
- android:requestLegacyExternalStorage="true" 在 Android 11 上被忽略。此版本的 Android 强制执行范围存储,而不管您的清单中的此标志如何,因此您可以安全地使用出来是因为它对您的设备没有影响。
- 由于分区存储是强制执行的,因此不允许应用访问其他应用的私有存储位置。在您的情况下,您将文件保存在 getApplicationContext().getExternalFilesDir(null).getAbsolutePath() 中,这是您应用程序的私有位置。 Android 11 的分区存储规则将禁止您的外部 PDF 查看器应用程序打开您应用程序所在位置的任何文件。 在 Android 11,如果您想让另一个应用程序打开您的应用程序创建的文档,您至少有两个选择,而且可能更多。
a) 一个复杂的。使用 FileProvider https://developer.android.com/reference/androidx/core/content/FileProvider
b) 这个要简单得多。由于您的目的是与另一个应用程序共享此文件,而不是写入您应用程序的特定目录,您应该使用 MediaStore API 并将其写入 MediaStore.Downloads.EXTERNAL_CONTENT_URI。网上有很多很好的例子,例如 How to save pdf in scoped storage? 您的 PDF 查看器应该可以从那里访问它。