java.lang.SecurityException:权限拒绝:打开提供者com.google.android.apps.photos.content.GooglePhotosImageProvider

Sna*_*ake 17 android

突然间,我开始从运行android 4.3及更高版本的设备获得以下异常

java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.content.GooglePhotosImageProvider from ProcessRecord{454ca9d0 5914:com.propertymanager/u0a10231} (pid=5914, uid=10231) requires com.google.android.apps.photos.permission.GOOGLE_PHOTOS or com.google.android.apps.photos.permission.GOOGLE_PHOTOS
        at android.os.Parcel.readException(Parcel.java:1431)
        at android.os.Parcel.readException(Parcel.java:1385)
        at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2896)
        at android.app.ActivityThread.acquireProvider(ActivityThread.java:4755)
        at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2480)
        at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1152)
        at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:759)
        at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:665)
        at android.content.ContentResolver.openInputStream(ContentResolver.java:500)
        at com.myapp.xxxx.determineCorrectScale(SourceFile:148)
Run Code Online (Sandbox Code Playgroud)

我导致它的代码是

    public static int determineCorrectScale(Context con, Uri imagUri) {
        int scale = 1;
        InputStream imageStream = null;

                imageStream = con.getContentResolver().openInputStream(imagUri);
.
.
.
    }
Run Code Online (Sandbox Code Playgroud)

任何帮助?

编辑:这是我让用户在调用上述方法之前选择图片的方式

Intent choosePictureIntent = new Intent(Intent.ACTION_PICK, Images.Media.INTERNAL_CONTENT_URI);
tartActivityForResult(choosePictureIntent, REQUEST_CHOOSE_IMAGE);
Run Code Online (Sandbox Code Playgroud)

这是OnActivityResult:

protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
        case REQUEST_CHOOSE_IMAGE:

            Uri selectedImage = intent.getData();

            try {

                int scale = CommonFunc.determineCorrectScale(this, selectedImage);
Run Code Online (Sandbox Code Playgroud)

Ema*_*lin 27

虽然添加权限适用于此特定内容提供商,但如果您的数据由其他内容提供商提供,则无法使用(在Android上,除非您明确访问该内容提供商,否则无法保证您将获得特定内容提供商提供的数据).

这个问题的"最终"解决方案可以在这里找到:

获得临时权限的访问权限

即使您没有适当的访问权限,也可以通过向具有权限的应用程序发送意图并接收包含"URI"权限的结果意图来访问内容提供程序中的数据.这些是特定内容URI的权限,这些内容URI将持续到接收它们的活动完成为止.

http://developer.android.com/guide/topics/providers/content-provider-basics.html

从版本4.3开始,Android会检查接收活动是否仍在运行,如果不是则抛出SecurityException.determineCorrectScale是一个静态方法,因此我假设它至少有时在Activity生命周期之外调用.要一劳永逸地修复此问题,您需要在Activity运行时从内容提供程序检索数据.我不知道您的应用程序的要求,但如果没有涉及繁重的工作(如从内容提供商复制图像),那么只需在ui线程上进行.如果需要繁重的工作,那么使用Activity启动的AsyncTask,然后你必须确保在检索数据之前Activity没有完成(这可能很棘手).

我不只是添加了这个答案,因为我认为它是正确的,但是因为其他开发人员可能不知道4.3/4.4中引入的这种变化,并且可能与其他内容提供商遇到同样的问题.


Cod*_*rji 22

您需要将此权限添加到清单:

<uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>
Run Code Online (Sandbox Code Playgroud)

希望这对你有用.请给我一个反馈

  • 哦好的,这是一个新的许可吗?我以前从未见过它.我不能重现它我没有4.3设备所以我希望它修复它:) (3认同)
  • 非常感谢!当图像尚未下载时,似乎需要此权限. (2认同)