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


Мое приложение позволяет пользователям импортировать свои фотографии и видео из других приложений. Теперь, когда Google заменил Google + Фото на Google Фото, пара вещей сломалась для меня. Одна из таких вещей-повторное использование импортированных файлов после перезагрузки приложения. У меня есть ощущение, что они ужесточили разрешения, выданные, когда Google Photos возвращает намерение с 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 20

6 ответов:

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

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

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

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

  3. Например, вы определяете 2 действия в файле манифеста, Actvity A и Activity B. Activity A for получает намерение.ACTION_SEND. Упражнение B для обработки файла изображения. Активность форварда целью деятельности Б. Затем б не правильные действия для "Google Фото", то возникает исключение securityexception.

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

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

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

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

Вид в этом вопрос двойники

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

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