当我在 Android Q 设备上测试打印 PDF 功能时,我突然遇到了这个问题。它在 Android P 之前运行良好。我尝试在互联网上找到解决方案,但没有用。任何帮助都会很好。
2 回答
我在升级到 API Level 31 时遇到了这个问题。
它来自这样一个事实,在我拥有的 pdfprint 类中,有一行代码带有:
if (file.createNewFile()) {
return ParcelFileDescriptor.open(file,
ParcelFileDescriptor.MODE_READ_WRITE); }
通过添加在创建文件之前删除文件的代码,它工作得很好
if (file.exists()) file.delete();
if file.createNewFile()
return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_WRITE);
我使用的代码是基于我在 Internet 上找到的代码,所以我没有花时间去清理它,但它解决了我的问题。
我通过参考这里的官方文档得到了解决方案:Android 10 Privacy
我们必须添加:
android:requestLegacyExternalStorage="true"
在版本 >= 29 的清单文件的应用程序标记中。
The documentation:
如果 {@code true} 此应用程序希望在旧存储模型下运行。请注意,由于政策或向后兼容性的原因,这可能并不总是得到尊重。不请求旧版存储的应用可以继续通过 {@code MediaStore} 发现和读取属于其他应用的媒体。默认值为: - {@code false} 适用于 targetSdkVersion >= 29 (Q) 的应用。- {@code true} 适用于 targetSdkVersion 29 的应用。
虽然从文章中说,从 Android 11 开始,将引入范围存储,因此从 Android 11 开始,这种解决方法是不可能的。
这里,
为了给开发者更多的测试时间,面向 Android 10(API 级别 29)的应用仍然可以请求 requestLegacyExternalStorage 属性。
因此,您将不得不强制跳转到 >= Android 11 的范围存储。
希望这个解决方案可以帮助某人。