【发布时间】:2015-09-09 18:04:59
【问题描述】:
我拥有以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
我在 openInputStream 行收到权限拒绝错误:
if(bgUri != null && !bgUri.isEmpty()) {
try {
InputStream inputStream = context.getContentResolver().openInputStream(Uri.parse(bgUri)); // <-- error
return Drawable.createFromStream(inputStream, bgUri);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
我首先加载我的图像
@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
if (requestCode == SELECT_PHOTO && resultCode == Activity.RESULT_OK) {
try {
final Uri imageUri = imageReturnedIntent.getData();
final int takeFlags = imageReturnedIntent.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Check for the freshest data.
mContext.getContentResolver().takePersistableUriPermission(imageUri, takeFlags);
然后保存图片uri:
String backgroundURI = imageUri.toString();
int backgroundID = 0;
mStore.backgroundImageURI = backgroundURI;
mStore.backgroundImageNumber= backgroundID;
mStore.save();
堆栈跟踪:
﹕ FATAL EXCEPTION: main
Process: com.myapp.pocketandroid, PID: 1284
java.lang.RuntimeException: Unable to resume activity {com.myapp.pocketandroid/com.myapp.pocketandroid.MainActivity}: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{52946004 1284:com.myapp.pocketandroid/u0a60} (pid=1284, uid=10060) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2774)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2803)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2238)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{52946004 1284:com.myapp.pocketandroid/u0a60} (pid=1284, uid=10060) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS
at android.os.Parcel.readException(Parcel.java:1465)
at android.os.Parcel.readException(Parcel.java:1419)
at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2848)
at android.app.ActivityThread.acquireProvider(ActivityThread.java:4399)
at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2208)
at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1425)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1047)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:904)
at android.content.ContentResolver.openInputStream(ContentResolver.java:629)
at com.myapp.pocketandroid.Utils.BackgroundImageManager.background(BackgroundImageManager.java:29)
at com.myapp.pocketandroid.BaseActivity.setBackground(BaseActivity.java:83)
at com.myapp.pocketandroid.BaseActivity.onResume(BaseActivity.java:44)
当我恢复活动并尝试加载 URI 时,为什么会出现 MediaDocumentsProvider 权限崩溃?我认为通过获得许可,我将永久保留许可。
【问题讨论】:
-
请发布您的“尝试加载 URI”的代码以及完整的堆栈跟踪。
-
@CommonsWare 崩溃出现在第一个代码块中。我添加了一个堆栈跟踪。
-
在调用
takePersistableUriPermission()和openInputStream()之间你在做什么?您写道,当您“恢复 [您的] 活动”时,您会遇到此崩溃。您的意思是字面意思吗(即,它与您使用takePersistableUriPermission()的活动实例相同,并且刚刚回到前台)?还是你的意思是别的? -
我正在选择背景图片,保存它,它工作正常。我关闭应用程序,重新启动设备。在恢复活动时,BaseActivity 设置背景。它通过从数据库模型中查找 bgURI 来做到这一点,该模型使用 InputStream inputStream = context.getContentResolver().openInputStream(Uri.parse(bgUri)); 调用。 . >> 崩溃
-
“我正在选择背景图片”——通过
ACTION_OPEN_DOCUMENT?考虑到异常细节,我会假设是这样。如果是,那么我不知道为什么这对您不起作用。好像很多人都遇到过这个问题,我还没玩过takePersistableUriPermission(),不过这显然是我需要努力的事情……
标签: android android-intent permissions