Система хранения mediastore.Изображения.Средства массовой информации.insertImage бросает отказ в разрешении на некоторых устройствах


У меня проблема со строкой кода:

String path = MediaStore.Images.Media.insertImage(activity.getContentResolver(), bitmap, "feedback", null);

Активность не равна нулю, растровое изображение не равно нулю.

Я получаю ошибку:

0-22 11:23:59.644 29514-29527/? E/DatabaseUtils: Writing exception to parcel
10-22 11:23:59.644 29514-29527/? E/DatabaseUtils: java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=1380, uid=10136 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
10-22 11:23:59.644 29514-29527/? E/DatabaseUtils:     at android.content.ContentProvider.enforceWritePermissionInner(ContentProvider.java:679)
10-22 11:23:59.644 29514-29527/? E/DatabaseUtils:     at android.content.ContentProvider$Transport.enforceWritePermission(ContentProvider.java:494)
10-22 11:23:59.644 29514-29527/? E/DatabaseUtils:     at android.content.ContentProvider$Transport.insert(ContentProvider.java:258)
10-22 11:23:59.644 29514-29527/? E/DatabaseUtils:     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:163)
10-22 11:23:59.644 29514-29527/? E/DatabaseUtils:     at android.os.Binder.execTransact(Binder.java:453)
10-22 11:23:59.645 1380-1467/? E/MediaStore: Failed to insert image
10-22 11:23:59.645 1380-1467/? E/MediaStore: java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=1380, uid=10136 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at android.os.Parcel.readException(Parcel.java:1599)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at android.content.ContentResolver.insert(ContentResolver.java:1231)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at android.provider.MediaStore$Images$Media.insertImage(MediaStore.java:962)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at com.azimo.sendmoney.a.utils.Screenshot$1.call(Screenshot.java:58)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at com.azimo.sendmoney.a.utils.Screenshot$1.call(Screenshot.java:51)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at rx.Observable.unsafeSubscribe(Observable.java:7531)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at rx.internal.operators.OperatorSubscribeOn$1$1.call(OperatorSubscribeOn.java:62)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
10-22 11:23:59.645 1380-1467/? E/MediaStore:     at java.lang.Thread.run(Thread.java:818)

У меня есть разрешения в моем манифесте:

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Работает на 5.1.1 Nexus 4. Не работает на 6.0 Nexus 6.

У вас есть какие-нибудь идеи, как я мог бы это исправить? Может быть, добавить некоторые разрешения программно?
1 4

1 ответ:

Цитирование developers.android.com :

Начиная с Android 6.0 (уровень API 23), пользователи предоставляют разрешения на приложения во время работы приложения, а не при его установке. Этот подход упрощает процесс установки приложения, так как пользователь этого не делает. необходимо предоставить разрешения при установке или обновлении приложения. Это также дает пользователю больше контроля над функциональностью приложения; например, пользователь может выбрать, чтобы дать приложению камеры доступ к камере, но не в расположение устройства. Пользователь может отозвать разрешения в любое время. время, перейдя на экран настроек приложения.

Системные разрешения делятся на две категории: обычные и стандартные. опасно:
  • Обычные разрешения не создают прямой угрозы конфиденциальности пользователя. Если ваш приложение перечисляет обычное разрешение в своем манифесте, система предоставляет разрешение автоматически.

  • Опасные разрешения может дать приложение доступ к информации пользователя конфиденциальные данные. Если ваше приложение содержит обычный список разрешение в своем манифесте система предоставляет разрешение автоматически. Если вы перечисляете опасное разрешение, пользователь должен явно дайте одобрение вашему приложению.

READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE относятся к категории опасных, по этой причине, когда targetSdkVersion составляет 23 или выше, вам нужно запросить разрешение непосредственно у пользователя, когда приложение работает.

Ничего не изменилось для устройства с уровнем API ниже 23, вот почему у вас нет никаких проблем с Nexus 4.

Вы можете найти дополнительную информацию о том, как проверить и запросить разрешение здесь: https://developer.android.com/training/permissions/requesting.html