我有一个应用程序,可以从资产中复制 .pdf 文件并将其保存在本地。然后,用户可以使用意图在第三方应用程序中打开 .pdf 进行注释,然后保存 .pdf。一旦用户保存带注释的 .pdf,我现在就失去了对该 .pdf 的权限。例如,如果他们将其保存在同一位置(覆盖原始文件),我在尝试重新打开它时会收到“EACCES PERMISSION DENIED”。如果用户将其保存在单独的目录中,我不会收到错误,但就好像该文件不存在一样。当我使用 .exists() 检查目录是否存在时,它返回 true,但是当我在目录上运行 listFiles() 时,它返回 null。
下面是我正在使用的目录的示例。
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS + "/Folder Name")
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS + "/Folder Name").exists()
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS + "/Folder Name").listFiles()
我的理解是我不需要请求权限,但无论如何,我确实将
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
添加到了我的清单中,但这并没有解决问题。有什么想法为什么会发生这种情况吗?
您只能访问
Documents/
中由您的应用程序创建的文件。保存对文件(尤其是 PDF 这样的文件)所做更改的典型方法是使用临时名称写出新文件,删除原始文件,然后将新文件重命名为原始文件的名称。此技术的副作用是您的应用程序失去访问该文件的权限,因为您创建了现已删除的原始副本,而不是修改后的副本。
请使用存储访问框架:
ACTION_OPEN_DOCUMENT
/ ActivityResultContracts.OpenDocument
打开现有 PDF ACTION_CREATE_DOCUMENT
/ ActivityResultContracts.CreateDocument
创建新的 PDF 这不仅可以让您解决权限问题,还可以让用户自由地将 PDF 存储在他们想要的位置,而不是硬编码的位置。