2014-01-13 4 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); 
. 
. 
. 
    } 

Любая помощь ??

EDIT: Это, как я позволить пользователю выбрать изображение перед вызовом выше метод

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.Разрешение GOOGLE_PHOTOS в SDK - даже для уровня 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

Извините за пониженное голосование. Вопрос не достаточно ясен, будет ли доступ к этому конкретному провайдеру контента, или если другие контент-провайдеры могут быть использованы, так что на самом деле нет никакой информации о том, является ли ваш ответ правильным или нет. В зависимости от обратной связи Снейка я конвертирую его в голосование (или нет). –

22

При добавлении разрешений для данного конкретного поставщика контента это не сработает, если ваши данные будут доставлены другими поставщиками контента (на Android нет гарантии, что вы получите данные определенным поставщиком контента если вы явно не обращаетесь к этому поставщику контента).

«окончательное» решение этой проблемы можно найти здесь:

Получение доступа с временным разрешениями

Вы можете получить доступ к данным в контент-провайдера, даже если у вас нет правильные разрешения доступа , отправив намерение к приложению, что действительно имеет разрешения и получает обратно цель результата , содержащую разрешения «URI». Это разрешения для определенного URI , который длится , пока не будет получена его деятельность завершено.

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

Начиная с версии 4.3 чеками Android ли принимающая активность по-прежнему работает, и если не бросает SecurityException. ОпределениеCorrectScale - статический метод, поэтому я предполагаю, что он по крайней мере иногда вызывается за пределами жизненного цикла Activity. Чтобы исправить это раз и навсегда, вам необходимо получить данные от поставщика контента во время работы Activity. Я не знаю требований к вашему приложению, но если нет тяжелой работы (например, копирование изображений из поставщика контента), просто сделайте это на нити ui. Если требуется тяжелая работа, используйте AsyncTask, запущенный Activity, но затем вы должны убедиться, что Activity не завершила работу до того, как данные были восстановлены (что может быть сложно).

Я не просто добавил этот ответ, потому что я думаю, что он правильный, но потому, что другие разработчики могут не знать об этом изменении, представленном в 4.3/4.4, и могут столкнуться с той же проблемой с другими поставщиками контента.

+0

Благодарим вас за подробный ответ. +1. Требование к моему приложению заключается в том, что во время жизненного цикла моей деятельности пользователь нажимает кнопку для загрузки изображения из своей галереи, как только изображение выбрано, я беру URI и вызываю defineCorrectScale, чтобы я мог пробовать изображение и загружать его в режим просмотра изображения (и скопируйте дискретизацию в локальные файлы для будущей быстрой загрузки). Я использую следующий контент-провайдер только getContentResolver(). OpenInputStream – Snake

+0

Ох и статический метод, поэтому я могу назвать его из любого места, но пока я нахожу его только из-за действия – Snake

+0

. Как вы позволяете пользователю выбрать изображение из галереи? Думаю, вы начинаете какую-то деятельность с использованием намерения? Можете ли вы опубликовать этот фрагмент кода? Я спрашиваю, потому что в этом случае возвращаемый URI является произвольным URI в зависимости от того, какие приложения (ов) галереи установлены пользователем, и, следовательно, поставщик контента является произвольным, что означает добавление этого разрешения может исправить исключение для этого конкретного поставщика контента, но не для других поставщиков контента. –

Смежные вопросы