Android 如何移除存储访问框架(Storage Access Framework)的持久化Uri权限
移除SAF treeUri持久化权限的实现方案
你之前通过takePersistableUriPermission申请的持久化权限,有完全对应的配套API可以移除,不需要做特殊额外处理:
核心调用方法
直接调用ContentResolver提供的releasePersistableUriPermission接口,传入和申请时完全一致的uri与权限标识即可:
// 移除指定treeUri的持久化读写权限 getContentResolver().releasePersistableUriPermission( treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION );
关键注意事项
- 权限标识要和申请时完全匹配:如果当初申请了读、写两个flag,移除时也要同时传入这两个flag,不要只传其中一个,否则会出现对应权限残留的问题。
- 传入的treeUri要和当初申请授权的原始uri完全一致,不能是拼接了子路径、修改了查询参数的衍生uri,否则系统无法匹配到对应的权限记录,会抛出安全异常或调用失效。
- 调用该方法不需要持有uri的临时有效访问权限:只要是你的应用当初申请的持久化权限,哪怕临时授权已经过期,依然可以正常调用该方法完成移除操作。
常见坑点提醒:调用移除方法后,系统存储访问框架的授权列表中对应目录的授权状态会同步更新,后续直接访问该uri会抛出权限拒绝异常,需要重新走系统授权流程才能恢复访问。
内容的提问来源于stack exchange,提问作者pol2095
相关产品推荐
相关产品推荐

