我使用Android Storage Access Framework访问SD卡上的某些文件。对我来说,保持此权限很重要,以便在设备重新启动后能够编辑文件。

因此,根据Storage Access Framework documentation的使用,我使用了Persist权限,即使设备已重新启动,该权限也使用户可以继续通过您的应用程序访问文件。

但是,一段时间后,我注意到某些用户的权限被撤销。因为当我尝试使用SAF进行书写时,我得到了android.system.ErrnoException: open failed: EACCES (Permission denied)在该异常之后,我使用mContext.getContentResolver().getPersistedUriPermissions()检查我具有哪些权限,但是它返回空列表。我确定用户为我提供了正确的权限,并且该权限适用于当前安装的SD卡,因为我在数据库中跟踪了此操作。

当前,在这种情况下,我正在显示文档选择器,以便用户可以为我提供更多时间新的权限,但是要求用户执行相同的操作通常对用户不友好。

什么会导致撤销权限?以及我如何防止这种撤销?

我已经在所有设备上测试了手机的多次重启,更改时间,删除了插入sd卡的操作,但是并没有丢失任何saf权限。

我有下一个用于获取权限的代码:

private void openDocumentTree() {
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        startActivityForResult(intent, REQUEST_CODE);
    }

public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE) {
            Uri treeUri = data.getData();
            final int takeFlags = data.getFlags() & (
                    Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            mContext.getContentResolver().takePersistableUriPermission(treeUri,
                    takeFlags);

                    //this is my internal class for saving and restoring tree uri permissions.
                    final Permission permission = Permission.from(treeUri);
                    mPermissionDao.save(permission);
        }
    }

最佳答案

请求ACTION_OPEN_DOCUMENT_TREE时需要其他标志。
openDocumentTree应该看起来像

private void openDocumentTree() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
    intent.addFlags(
        Intent.FLAG_GRANT_READ_URI_PERMISSION
        | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
        | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
        | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
    startActivityForResult(intent, REQUEST_CODE);
}

查看FLAG_GRANT_PERSISTABLE_URI_PERMISSIONFLAG_GRANT_PREFIX_URI_PERMISSION的文档

关于android - Storage Access Framework持久权限不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32563428/

10-12 00:22
查看更多