如何在吊销 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

有没有办法要求内容提供商在上一个权限停止工作后再次重新授予 URI 权限?

不,除了像第一次一样再次回顾ACTION_OPEN_DOCUMENT

卸载该应用程序旨在留下很少的东西。从设备的角度来看,重新安装的应用程序与该应用程序的原始安装无关。

此外,正如 Pawel 所暗示的那样,存在一个问题 重新安装的应用程序在哪里得到这个Uri .原则上,虽然在本地Uri持久保存文档是可以的(如果您获得了持久权限(,但将其转移到设备外(备份、服务器等(可能效果不佳。

最新更新