Используете данные от поставщиков контекста или запрашиваете разрешение на чтение в Google Фото?

Мое приложение позволяет пользователям импортировать свои фотографии и видео из других приложений. Теперь, когда Google заменил Google+ Photos на Google Photos, кое-что сломалось для меня. Одна из этих вещей - повторное использование импортированных файлов после перезапуска приложения. У меня такое ощущение, что они ужесточили разрешения, выдаваемые, когда Google Фото возвращает намерение с URI изображения, поэтому после того, как мое приложение было убито, у него больше нет разрешения на доступ к загруженному файлу. Я получаю ожидание безопасности:

java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.contentprovider.MediaContentProvider from ProcessRecord{2c17ab9e 2124:com.myapp.myapp/u0a436} (pid=2124, uid=10436) that is not exported from uid 10427

РЕДАКТИРОВАТЬ:

Я также получаю ту же проблему с повторным использованием файлов, предоставленных com.google.android.apps.docs.sync.filemanager.FileProvider

Любые предложения / обходной путь? Я знаю, что могу прочитать файл до того, как потерял разрешение, поэтому теоретически я могу его скопировать, но не могу сказать, что мне это очень нравится..

6 ответов

Решение

Да, это так, как описано на сайте разработчиков Android.

По соображениям безопасности разрешения являются временными, поэтому, как только стек задач клиентского приложения будет завершен, файл больше не будет доступен. Вы должны получить данные файла при получении намеренного ответа в методе onActivityResult. Сохраните копию данных файла, потому что файл больше не будет доступен после возврата onActivityResult.

  1. Вы можете воспроизвести этот журнал SecurityException при использовании приложения "Google Фото".

  2. Основной причиной этой проблемы является то, что "Google Photo" делится ContentUri с фиксированной строкой, такой как "content://com.google.android.apps.photos.contentprovider/1/1", и связывает его со статическими временными значениями. "Google Фото" не предоставляет путь к файлу при фактическом действии или контексте, который получает Intent.ACTION_SEND. Может быть, это политика "Google Photo", чтобы не подвергать частный файл изображения другому приложению.

  3. Например, вы определяете действие 2 в файле манифеста, Actvity A и Activity B. Для действия A для получает Intent.ACTION_SEND. Деятельность B для обработки файла изображения. Упражнение A направляет намерение к занятию B. Тогда занятие B не является верным занятием в "Google Photo", вы обнаруживаете исключение SecurityException.

Итак, я рекомендую вам временно сохранить файл в Деятельности A и использовать путь временного файла в Деятельности B

Может быть, вы можете попробовать добавить это разрешение пользователя в свой файл манифеста.

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

Похоже, этот вопрос является одновременным

Я думаю, что когда активность (не фрагмент) умирает - все извлеченные им URI становятся недействительными

У меня тоже такая же проблема - пытаюсь загрузить картинку в фоновом режиме. Но пользователь в потоке пользовательского интерфейса может изменить активность, и URI станет недействительным

Вам необходимо явно установить разрешения для всех пакетов, соответствующих вашим намерениям. Обычно это происходит в Android 4.4.

Вы можете использовать эту утилиту, чтобы сделать это:

List<ResolveInfo> resInfoList = getContext().getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        for (ResolveInfo resolveInfo : resInfoList) {
            String packageName = resolveInfo.activityInfo.packageName;
            getContext().grantUriPermission(packageName, imageFileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }
Другие вопросы по тегам