撤销URI权限后如何重新请求?

时间:2019-03-31 15:04:22

标签: java android permissions uri android-contentprovider

在我的应用中,我正在从手机存储中打开文件。我在保持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

1 个答案:

答案 0 :(得分:3)

  

是否有一种方法可以要求ContentProvider在上一个停止工作后再次重新授予URI权限?

不,除了像您第一次一样再次通过ACTION_OPEN_DOCUMENT

卸载该应用程序的目的很少。从设备的角度来看,重新安装的应用与该应用的原始安装没有任何关系。

另外,作为Pawel hints at,还有一个问题是您重新安装的应用程序在哪里获得此Uri。原则上,在本地保存文档Uri是可以的(如果您具有持久权限),但是将其从设备(备份,服务器等)传输出去可能效果不佳。

相关问题