java - 撤销后如何重新请求URI权限?
问题描述
在我的应用程序中,我正在从手机存储中打开文件。我在保持 URI 权限正常工作时遇到问题(不是那个EXTERNAL_STORAGE
)。
我首先要求将文件打开为:
Intent mediaIntent = new Intent();
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
mediaIntent.setAction(Intent.ACTION_GET_CONTENT);
} else {
mediaIntent.setAction(Intent.ACTION_OPEN_DOCUMENT);
mediaIntent.addCategory(Intent.CATEGORY_OPENABLE);
}
mediaIntent.setType("audio/*");
startActivityForResult(mediaIntent, 1);
我能够获得 URI 许可并将“持久”许可作为:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && resultCode == Activity.RESULT_OK && data != null) {
Uri uri = data.getData();
int takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getContentResolver().takePersistableUriPermission(uri, takeFlags);
}
}
}
然后我保存uri.toString()
以便SharedPreferences
之后能够读取文件。关闭应用程序或重新启动手机工作正常,我仍然可以访问该文件。但是,如果我通过以下方式卸载该应用程序adb uninstall
,然后尝试通过以下方式访问该文件:
String[] proj = { OpenableColumns.DISPLAY_NAME };
getApplicationContext().getContentResolver().query(uri, proj, null, null, null);
事实证明,我不再有权访问 URI(checkCallingUriPermission
返回PackageManager.PERMISSION_DENIED
)。
有没有办法ContentProvider
在前一个停止工作后要求再次重新授予 URI 权限?
来电:
ContentResolver cr = getApplicationContext().getContentResolver();
cr.takePersistableUriPermission(uri, takeFlags);
给我
No persistable permission grants found for UID X and Uri Y
解决方案
有没有办法让 ContentProvider 在前一个停止工作后再次重新授予 URI 权限?
不,除了ACTION_OPEN_DOCUMENT
像你第一次那样重来一遍。
卸载应用程序旨在留下一点点。从设备的角度来看,您重新安装的应用程序与该应用程序的原始安装无关。
此外,正如Pawel 所暗示的那样,您重新安装的应用程序在哪里得到了这个问题Uri
。原则上,虽然在本地持久化文档Uri
是可以的(如果您获得了持久化权限),但将其转移到设备外(备份、您的服务器等)可能效果不佳。
推荐阅读
- javascript - .map 在 Heroku 上部署时不是一个函数
- json - Vue,带过滤器的 Axios
- python - 如何使用单个值范围对 pandas 数据框中的值进行分位数
- r - r中组内的有效成对操作
- reactjs - 使用带有 react typescript 和 spring boot 的 api 获取数据
- reactjs - 在没有测试文件的情况下反应 src 中的检查文件
- arrays - React Native - 映射对象数组
- c++ - 如何自动显示水平滚动条?(C++ 生成器,VCL)
- python - 对五个常微分方程建模,并绘制它们
- html - 创建带有可滚动标题的表格