【问题标题】:How to re-request URI permission after it is revoked?撤销后如何重新请求URI权限?
【发布时间】:2019-03-31 15:04:22
【问题描述】:

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

【问题讨论】:

    标签: java android permissions uri android-contentprovider


    【解决方案1】:

    有没有办法让 ContentProvider 在前一个停止工作后再次重新授予 URI 权限?

    不,除了像你第一次那样再次通过ACTION_OPEN_DOCUMENT返回。

    卸载应用程序的目的是留下一点痕迹。从设备的角度来看,您重新安装的应用与该应用的原始安装无关。

    另外,作为Pawel hints at,您重新安装的应用程序在哪里得到这个Uri 的问题。原则上,虽然在本地持久化文档Uri 是可以的(如果您获得了持久化权限),但将其转移到设备外(备份、您的服务器等)可能效果不佳。

    【讨论】:

    • 感谢您的确认。你能转发 Pawel 的评论吗?我看不到它(它被删除了吗?)
    • 我撤回了我的评论,但我想知道重新安装后您是否在重新使用通过应用备份恢复的uri,这显然会导致问题。
    猜你喜欢
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多