Подтвердить что ты не робот

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

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

EDIT:

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

  • Вы можете воспроизвести этот журнал SecurityException, когда используете приложение Google Photo.

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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