1

У меня есть отказ в доступе при общении видео .mp4 файл с файловым провайдером и Intent.EXTRA_TEXT.Обмен видео + текст с помощью FileProvider вызывает исключение отказа от разрешения

если я удалить строку:

shareIntent.putExtra(Intent.EXTRA_TEXT, "#myappHashtag"); 

все работает. Но мне нужен и видеофайл + дополнительный текст.

Я думаю, проблема заключается в следующем: caption =% 23myappHashtag в share uri, но как я могу это исправить?

Большое вам спасибо.

private void ShareItem(File fileToShare) { 

    String package_name = "com.lucagrillo.myapp"; 
    Uri uri = FileProvider.getUriForFile(this, package_name + ".fileprovider", fileToShare); 
    Intent shareIntent = new Intent(); 
    shareIntent.setAction(Intent.ACTION_SEND); 
    shareIntent.putExtra(Intent.EXTRA_STREAM, uri); 
    shareIntent.putExtra(Intent.EXTRA_TEXT, "#myappHashtag"); 
    shareIntent.setType(intentFormatType); 

    startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.share_with))); 

} 

Исключение:

Writing exception to parcel 
    java.lang.SecurityException: Permission Denial: reading android.support.v4.content.FileProvider uri content://com.lucagrillo.myapp.fileprovider/images/shareFile.mp4?caption=%23myappHashtag from pid=9630, uid=10093 requires the provider be exported, or grantUriPermission() 
    at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:608) 
    at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:483) 
    at android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:474) 
    at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:419) 
    at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:313) 
    at android.os.Binder.execTransact(Binder.java:565) 

Manifest поставщик файла:

<provider 
    android:name="android.support.v4.content.FileProvider" 
    android:authorities="com.lucagrillo.myapp.fileprovider" 
    android:grantUriPermissions="true" 
    android:exported="false"> 
    <meta-data 
     android:name="android.support.FILE_PROVIDER_PATHS" 
     android:resource="@xml/filepaths" /> 
</provider> 
+1

В какой версии Android вы тестируете? Можете ли вы включить свою манифестную запись для «FileProvider»? – ianhanniballake

+0

Я тестирую на android 7.0. Просто заметил, что он работает для многих приложений, кроме Whatsapp –

+0

Добавлен агент манифестного файла –

ответ

4

Вы пропустили вызов addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) на вашем Intent. Это будет работать, если ваш minSdkVersion равен 21 или выше, чтобы предоставить права на это Uri любому приложению, обрабатывающему запрос ACTION_SEND.

Если ваш minSdkVersion ниже 21, вам необходимо предоставить права на все возможные ACTION_SEND обработчики для вашего Intent. На этих более старых устройствах addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) предоставляет только разрешение Uri, которое у вас было бы на фасетке «данных» Intent (например, new Intent(Intent.ACTION_VIEW, uri)), а не Uri значения в дополнениях.

Вы завершаете с кодом выглядит немного как это:

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) { 
    i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    } 
    else { 
    List<ResolveInfo> resInfoList= 
     getPackageManager() 
     .queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY); 

    for (ResolveInfo resolveInfo : resInfoList) { 
     String packageName = resolveInfo.activityInfo.packageName; 
     grantUriPermission(packageName, outputUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    } 
    } 

(где i является Intent и outputUri является Uri вы положили в дополнительный)

Кроме того, в качестве напоминания: ACTION_SEND реализация не обязана поддерживать как EXTRA_TEXT, так и EXTRA_STREAM.

+1

Собственно, Android с [Jelly Bean] (https://android.googlesource.com/platform/frameworks/base/+/jb-release/core/java/android/content/Intent. java # 6630) переносит ваш поток и автоматически добавляет 'FLAG_GRANT_READ_URI_PERMISSION' в любое намерение' ACTION_SEND'. – ianhanniballake

+0

@ianhanniballake: Это не имеет особого смысла. Утилиты 'Uri' не затрагиваются' addFlags() 'до Android 5.0. Связана ли она с 'setClipData()' в коде, к которому вы привязались? – CommonsWare

+0

, как показано в связанном коде, метод 'migrateExtraStreamToClipData' преобразует дополнительные функции в ClipData, затем добавляет флаг гранта – ianhanniballake