2014-01-13 68 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,具體取決於用戶安裝了哪些圖庫應用程序,因此內容提供程序也是任意的,這意味着添加該權限可能會修復該特定內容提供程序的例外,但不會對於其他內容提供商。 –

相關問題