Использовать данные из поставщиков контекста или запрашивать разрешение на просмотр 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
Любые предложения/обходные пути? Я знаю, что могу прочитать файл до того, как потерял разрешение, поэтому теоретически я мог бы его скопировать, но я не могу сказать, что мне это очень нравится.
Ответы
Ответ 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 становится недействительным.
Ответ 6
У меня такая же проблема с этим,
и вы и попробуйте выполнить следующие методы: