Java.lang.SecurityException: отказ от разрешения: открытие провайдера com.google.android.apps.photos.content.GooglePhotosImageProvider

Внезапно я начал получать следующее исключение от устройств, работающих под управлением 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); . . . } 

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

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

Вам нужно добавить это разрешение в свой манифест:

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

Надеюсь, что это работает для вас. Пожалуйста, дайте мне отзыв

При добавлении разрешений для этого конкретного поставщика контента он не будет работать, если ваши данные будут доставлены другими поставщиками контента (на 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, и могут столкнуться с той же проблемой с другими поставщиками контента.