阅读com.google.android.apps.photos.contentprovider.MediaContentProvider需要导出提供程序,或者grantUriPermission()

时间:2016-07-11 07:43:18

标签: android android-6.0-marshmallow android-permissions google-photos

我从Android 6.0.1用户收到此崩溃报告:

STACK_TRACE=java.lang.SecurityException: Permission Denial: reading com.google.android.apps.photos.contentprovider.MediaContentProvider uri content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F19181/ORIGINAL/NONE/443149508 from pid=18891, uid=10128 requires the provider be exported, or grantUriPermission()
at android.os.Parcel.readException(Parcel.java:1620)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:146)
at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:692)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1104)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:942)
at android.content.ContentResolver.openInputStream(ContentResolver.java:662)
at fr.free.nrw.commons.upload.UploadService.uploadContribution(UploadService.java:176)
at fr.free.nrw.commons.upload.UploadService.handle(UploadService.java:114)
at fr.free.nrw.commons.upload.UploadService.handle(UploadService.java:27)
at fr.free.nrw.commons.HandlerService$ServiceHandler.handleMessage(HandlerService.java:19)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.os.HandlerThread.run(HandlerThread.java:61)

从环顾四周看,这似乎与Google相册权限com.google.android.apps.photos.permission.GOOGLE_PHOTOS有关。我已经在我的清单中拥有此权限,但此用户正在运行API 23,这需要运行时权限。

问题是,如何为此调用运行时权限?我知道如何为标准权限执行此操作,如https://developer.android.com/training/permissions/requesting.html#perm-check所述,但是当我尝试

ActivityCompat.requestPermissions(thisActivity,
                    new String[]{com.google.android.apps.photos.permission.GOOGLE_PHOTOS},

它无法编译。

我需要在运行时请求从Google照片访问图片的权限名称是什么?

1 个答案:

答案 0 :(得分:1)

实际上,您不需要任何许可。这是安全例外。

这是一个简单的条件: 当您通过意图ACTION_PICK请求谷歌照片应用程序后,您的照片选择获得提供商的许可。如果在另一个上下文中处理此代码,系统将抛出安全性异常。因为另一个上下文未经授权。

您的请求代码如下:

Intent galleryIntent = new Intent(Intent.ACTION_PICK);
galleryIntent.setType("image/*, video/*");
if (galleryIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(Intent.createChooser(galleryIntent, "Select File"), RESULT_CODE);
}

@ bluemist的回答非常明确:https://stackoverflow.com/a/30909105/1136117