2014-01-13 71 views
15

突然之间,我开始从运行Android 4.3和设备下面的异常上述java.lang.SecurityException异常:权限拒绝:开放商com.google.android.apps.photos.content.GooglePhotosImageProvider

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); 
+0

没有'com.google.android.apps.photos.permission。SDK中的GOOGLE_PHOTOS权限 - 甚至API级别19源也不会列出此权限。这可能只是Google的一些内部许可。 – ChuongPham

回答

22

你需要这个权限添加到您的清单:

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

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

+3

噢好的,这是一个新的许可?我从来没有见过它。我不能重现它我没有4.3设备,所以我希望它修复它:) – Snake

+0

很高兴它与你合作。我曾经有过同样的错误,但是当我阅读Google+的工作方式时,发现他们正在使用此权限与应用程序。它似乎是用来从你的手机上获取照片,甚至是那些已经在线存储的照片,就像在google +中一样,但我还不确定!请分享,如果你发现任何东西....为什么我得到一个投票! – Coderji

+1

对不起,问题还不清楚是否只有该特定的内容提供商会被访问,或者是否可能会使用其他内容提供商,所以真的不知道您的答案是否正确。根据Snake的反馈,我会将其转换为投票(或不投票)。 –

22

同时加入了权限适用于这个特定的内容提供商,如果你的数据是由其他内容提供商提供(在Android上有没有保证,你会通过特定内容提供商处获得的数据将无法正常工作除非你明确地访问该内容提供者)。

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

临时权限

获取访问

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

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

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

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

+0

谢谢你的详细解答。 +1。我的应用程序的要求是,在我的活动生命周期中,用户点击一个按钮来从他的画廊加载图片,一旦图片被选中,我拿起URI并调用determineCorrectScale,以便我可以对图片进行采样并将其加载到图像视图(并将采样的文件复制到本地文件以供将来快速加载)。我只使用下面的内容提供者getContentResolver()。openInputStream – Snake

+0

哦和静态方法,所以我可以从任何地方调用它,但到目前为止,我只从活动内部调用它 – Snake

+0

你如何让用户从图库中选择图片?我想你使用Intent开始一些活动?你能发表这段代码吗?我在问,因为在这种情况下,返回的URI是一个任意的URI,具体取决于用户安装了哪些图库应用程序,因此内容提供程序也是任意的,这意味着添加该权限可能会修复该特定内容提供程序的例外,但不会对于其他内容提供商。 –

相关问题