我使用 Android Storage Access Framework 来访问 SD 卡上的一些文件。保留此权限对我来说很重要,以便能够在设备重启后编辑文件。
因此,根据存储访问框架文档,我使用持久权限,即使设备已重新启动,用户也可以通过您的应用程序继续访问文件。
但是,一段时间后,我注意到某些用户的权限以某种方式被撤销。因为当我尝试使用 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);
}
}