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);
.
.
.
}
Любая помощь??
РЕДАКТИРОВАТЬ: Это, как я позволил пользователю выбрать изображение перед вызовом вышеупомянутого метода
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);
2 ответа
Вам нужно добавить это разрешение в ваш манифест:
<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. DefineCorrectScale является статическим методом, поэтому я предполагаю, что он по крайней мере иногда вызывается вне жизненного цикла Activity. Чтобы исправить это раз и навсегда, вам нужно извлечь данные из провайдера контента во время выполнения действия. Я не знаю требований к вашему приложению, но если в этом нет необходимости (например, копирование изображений из контент-провайдера), просто сделайте это в потоке пользовательского интерфейса. Если требуется тяжелая работа, используйте AsyncTask, запущенный Activity, но затем вы должны убедиться, что Activity не завершится до того, как будут получены данные (что может быть сложно).
Я не просто добавил этот ответ, потому что считаю его правильным, а потому, что другие разработчики могут не знать об этом изменении, внесенном в 4.3/4.4, и могут столкнуться с той же проблемой с другими поставщиками контента.