【问题标题】:java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.content.GooglePhotosImageProviderjava.lang.SecurityException:权限被拒绝:打开提供程序 com.google.android.apps.photos.content.GooglePhotosImageProvider
【发布时间】:2015-02-08 16:00:23
【问题描述】:

突然之间,我开始从运行 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)

我的导致它的代码是

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

                imageStream = con.getContentResolver().openInputStream(imagUri);
.
.
.
    }

有什么帮助吗??

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

Intent choosePictureIntent = new Intent(Intent.ACTION_PICK, Images.Media.INTERNAL_CONTENT_URI);
tartActivityForResult(choosePictureIntent, REQUEST_CHOOSE_IMAGE);

这是 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);

【问题讨论】:

  • SDK 中没有 com.google.android.apps.photos.permission.GOOGLE_PHOTOS 权限 - 即使 API 级别 19 的源代码也没有列出此权限。这可能是一些仅供 Google 使用的内部权限。

标签: android


【解决方案1】:

虽然添加权限适用于此特定内容提供者,但如果您的数据由其他内容提供者提供,则该权限将不起作用(在 Android 上,除非您明确访问该内容,否则无法保证您会通过特定内容提供者获取数据提供者)。

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

使用临时权限获取访问权限

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

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

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

我不只是添加那个答案,因为我认为它是正确的,而是因为其他开发人员可能不知道 4.3/4.4 中引入的这一更改,并且可能会遇到与其他内容提供商相同的问题。

【讨论】:

  • 感谢您的详细解答。 +1。我的应用程序要求是,在我的活动生命周期中,用户单击一个按钮以从他的图库中加载图片,一旦选择了图片,我将获取 URI 并调用 determineCorrectScale 以便我可以对图片进行采样并将其加载到图像视图(并将采样的一个复制到本地文件以供将来快速加载)。我只使用以下内容提供程序 getContentResolver().openInputStream
  • 哦,还有静态方法,所以我可以从任何地方调用它,但到目前为止我只能从活动中调用它
  • 如何让用户从图库中挑选图片?我猜您使用 Intent 开始一些活动?你可以发布那段代码吗?我之所以问,是因为在这种情况下,返回的 URI 是一个任意 URI,具体取决于用户安装的图库应用程序,因此内容提供者也是任意的,这意味着添加该权限可能会修复该特定内容提供者的异常,但不能对于其他内容提供商。
  • 请检查我的编辑以获取我用来获取图像 URI 的代码。你有什么建议?这可能是新接受的解决方案
  • 使用您的意图来检索图像意味着您可以获得任意内容提供者 uri。使用接受的答案,您将能够解决此特定内容提供商的问题,但一般情况下无法解决。我试图重现该问题,但未能触发 Google+ 图片提供程序,因此我也不确定我的回答是否能解决问题。如果您知道触发 Google+ 内容提供程序的方法(即具有 com.google.android.apps.photos.permission.GOOGLE_PHOTOS 权限的方法),请告诉我,我会再试一次。
【解决方案2】:

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

<uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>

希望这对你有用。请给我反馈

【讨论】:

  • 哦,好的,这是新权限吗?我以前从未见过。我无法重现它,因为我没有 4.3 设备,所以我希望它能修复它:)
  • 很高兴它与您合作。我曾经遇到过同样的错误,但是当我阅读 Google+ 的工作方式时,发现他们正在使用此权限与那里的应用程序。它似乎用于从您的手机获取照片,即使是像 google+ 一样在线存储的照片,但我还不确定!如果您发现任何东西,请分享....以及为什么我投了反对票!
  • 很抱歉投了反对票。关于是否只有特定的内容提供者会被访问,或者是否也可能使用其他内容提供者,这个问题还不够清楚,所以真的不知道你的答案是否正确。根据 Snake 的反馈,我会将其转换为支持(或不支持)。
  • 只有那个内容提供者会被使用
  • 非常感谢!当图像尚未下载时,似乎需要此权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 2018-10-28
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多