URI权限被撤销后如何重新申请?
How to re-request URI permission after it is revoked?
在我的应用程序中,我正在打开 phone 存储中的文件。我在保持 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 许可并将 "persistable" 作为:
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
中以便之后能够读取该文件。关闭应用程序或重新启动 phone 工作正常,我仍然可以访问该文件。但是,如果我通过 adb uninstall
卸载应用程序,然后尝试通过以下方式访问该文件:
String[] proj = { OpenableColumns.DISPLAY_NAME };
getApplicationContext().getContentResolver().query(uri, proj, null, null, null);
事实证明,我无法再访问 URI (checkCallingUriPermission
returns PackageManager.PERMISSION_DENIED
)。
有没有办法让 ContentProvider
在前一个停止工作后再次授予 URI 权限?
通话中:
ContentResolver cr = getApplicationContext().getContentResolver();
cr.takePersistableUriPermission(uri, takeFlags);
给我
No persistable permission grants found for UID X and Uri Y
Is there a way to ask ContentProvider to re-grant the URI permissions again after the previous one stopped working?
不,除了像第一次那样再次返回 ACTION_OPEN_DOCUMENT
。
卸载该应用程序旨在不遗余力。从设备的角度来看,您重新安装的应用与该应用的原始安装无关。
此外,作为 ,存在您重新安装的应用程序从何处获取此 Uri
的问题。原则上,虽然在本地持久保存文档 Uri
是可以的(如果您获得了持久权限),但将其传输到设备外(备份、您的服务器等)可能效果不佳。
在我的应用程序中,我正在打开 phone 存储中的文件。我在保持 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 许可并将 "persistable" 作为:
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
中以便之后能够读取该文件。关闭应用程序或重新启动 phone 工作正常,我仍然可以访问该文件。但是,如果我通过 adb uninstall
卸载应用程序,然后尝试通过以下方式访问该文件:
String[] proj = { OpenableColumns.DISPLAY_NAME };
getApplicationContext().getContentResolver().query(uri, proj, null, null, null);
事实证明,我无法再访问 URI (checkCallingUriPermission
returns PackageManager.PERMISSION_DENIED
)。
有没有办法让 ContentProvider
在前一个停止工作后再次授予 URI 权限?
通话中:
ContentResolver cr = getApplicationContext().getContentResolver();
cr.takePersistableUriPermission(uri, takeFlags);
给我
No persistable permission grants found for UID X and Uri Y
Is there a way to ask ContentProvider to re-grant the URI permissions again after the previous one stopped working?
不,除了像第一次那样再次返回 ACTION_OPEN_DOCUMENT
。
卸载该应用程序旨在不遗余力。从设备的角度来看,您重新安装的应用与该应用的原始安装无关。
此外,作为 Uri
的问题。原则上,虽然在本地持久保存文档 Uri
是可以的(如果您获得了持久权限),但将其传输到设备外(备份、您的服务器等)可能效果不佳。