Intereting Posts
Неудачное разрешение: Lcom / google / devtools / build / android / desugar / runtime / ThrowableExtension; Android: Как получить пользовательский вид высоты и ширины? Android: доступ к файлу базы данных sqlite для файлов с расширением .sqlite Как использовать ExecutorService с Android AsyncTask? Android: Можно ли масштабировать xml? Как определить, на какой платформе работает текущее приложение в LibGDX? Edittext меняет цвет границы с помощью shape.xml Где находится папка плагинов для Android Studio на MAC Есть ли простой способ нанести удар по тексту в виджетах приложения? Android 5.0 – ProgressBar не может отображаться над кнопкой Изменить размер буфера на MediaPlayer Какое знание / экспертиза требуется для переноса андроида на пользовательское устройство ручного управления? Как обрабатывать код, когда приложение убито путем прокрутки в android? Как сочетаются части конвейера чертежей Canvas для Android (2D)? ClassCastException: NoClassDefFoundError нельзя отбрасывать в RuntimeException

Android – поставщик файлов – отказ в разрешении

У меня есть два приложения: app1 и app2.

В App2 есть:

<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.android.provider.ImageSharing" android:exported="false" android:grantUriPermissions="true" > <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/paths" /> </provider> 

Paths.xml:

 <paths> <files-path name="my_images" path="images/"/> </paths> 

App2 получает запрос в своей Деятельности из App1, чтобы получить URI для изображения. Активность App2 делает следующее, как только URI определяется:

 Intent intent = new Intent(); intent.setDataAndType(contentUri, getContentResolver().getType(contentUri)); int uid = Binder.getCallingUid(); String callingPackage = getPackageManager().getNameForUid(uid); getApplicationContext().grantUriPermission(callingPackage, contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); setResult(Activity.RESULT_OK, intent); finish(); 

При получении результата из App2 App1 выполняет следующие действия:

 Uri imageUri = data.getData(); if(imageUri != null) { ImageView iv = (ImageView) layoutView.findViewById(R.id.imageReceived); iv.setImageURI(imageUri); } 

В App1, возвращаясь из App2, я получаю следующее исключение:

 java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{52a99eb0 3493:com.android.App1.app/u0a57} (pid=3493, uid=10057) that is not exported from uid 10058 

Что я делаю не так ?

Solutions Collecting From Web of "Android – поставщик файлов – отказ в разрешении"

Оказывается, единственный способ решить эту проблему – предоставить разрешения всем пакетам, которые могут понадобиться, например:

 List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); for (ResolveInfo resolveInfo : resInfoList) { String packageName = resolveInfo.activityInfo.packageName; context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); } 

Во-первых, я попытался бы grantUriPermission() от grantUriPermission() и просто поместить FLAG_GRANT_READ_URI_PERMISSION в сам Intent через addFlags() или setFlag() .

Если по какой-то причине это не сработает, вы можете попытаться переместить getCallingUid() в onCreate() вместо того, где бы вы ее ни находились, и посмотреть, можете ли вы найти фактического «вызывающего» там.

Просто добавьте setData(contentUri); И на основе требования добавить addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); Или addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

Это решает проблему java.lang.SecurityException: отказ в разрешении

Проверенные.

Это делается в соответствии с https://developer.android.com/reference/android/support/v4/content/FileProvider.html#Permissions

Спасибо @CommonsWare за его совет.

Проблема была в вызывающем пакете. По какой-то причине Binder.callingUid() и getPackageManager().getNameForUid(uid) дает мне имя пакета App2 вместо App1 .

Я пробовал называть его в App2 в onCreate а также onResume , но без радости.

Для его решения я использовал следующее:

 getApplicationContext().grantUriPermission(getCallingPackage(), contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 

Оказывается, для этой деятельности для этого предусмотрен выделенный API. См. Здесь .

Я решил проблему таким образом:

  Intent sIntent = new Intent("com.appname.ACTION_RETURN_FILE").setData(uri); List<ResolveInfo> resInfoList = activity.getPackageManager().queryIntentActivities(sIntent, PackageManager.MATCH_DEFAULT_ONLY); for (ResolveInfo resolveInfo : resInfoList) { activity.grantUriPermission(FILE_PROVIDER_ID, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); } sIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); activity.setResult(RESULT_OK, sIntent); 

Вам нужно установить разрешение определенного имени пакета, после чего вы сможете получить к нему доступ.

 context.grantUriPermission("com.android.App1.app", fileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);