Android 使用FileProvider通过Intent发送多个不同类型的文件
我想通过Android 使用FileProvider通过Intent发送多个不同类型的文件,android,android-intent,Android,Android Intent,我想通过Intent,使用FileProvider共享图像和音频文件当我尝试只发送两个文件中的一个文件时(它们都可以工作),但当我传递一个包含两个文件的URI的数组列表时,会出现以下异常 Writing exception to parcel java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/exter
Intent
,使用FileProvider
共享图像和音频文件当我尝试只发送两个文件中的一个文件时(它们都可以工作),但当我传递一个包含两个文件的URI的数组列表时,会出现以下异常
Writing exception to parcel java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/fs_id from pid=27900, uid=10062 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:605)
at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:480)
at android.content.ContentProvider$Transport.query(ContentProvider.java:211)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
at android.os.Binder.execTransact(Binder.java:453)
这是我在AndroidManifest
中设置提供程序的方式:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.mypackage.mybeautifulprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths" />
</provider>
如中所述,FLAG\u GRANT\u READ\u URI\u PERMISSION
和FLAG\u GRANT\u WRITE\u URI\u PERMISSION
仅适用于setData()中设置的URI。如果需要多个URI,则需要将它们添加为ClipData:
ClipData clipData = ClipData.newRawUri(null, imageUri);
clipData.addItem(new ClipData.Item(audioUri));
intent.setClipData(clipData);
请注意,这只是在API 16中添加的。使用ACTION\u SEND\u MULTIPLE
发送多个内容,而不是ACTION\u SEND
。即使您通过了权限问题,客户端也不会希望额外的\u流
中有操作发送
的数组。当我尝试使用操作发送多个
时,此异常由接收应用程序引发:java.lang.SecurityException:权限拒绝:从ProcessRecord{efa0d77 24711:com.google.android.gm/u0a64}(pid=24711,uid=10064)打开未从uid 10105导出的提供程序android.support.v4.content.FileProvider。。。我希望Intent
标志将波及数组元素,以执行ACTION\u SEND\u MULTIPLE
,它们对操作发送中的单个Uri
值的处理方式。使用剪辑数据时,我会遇到以下异常:将异常写入包java.lang.SecurityException:权限拒绝:读取com.android.providers.media.MediaProvider Uricontent://media/external/fs_id 从…起pid=31664,uid=10062需要android.permission.READ\u EXTERNAL\u存储,或者grantUriPermission()
,我想这是相对于android棉花糖权限而言的system@AlessandroRoaro-那么另一个应用程序正在尝试从MediaProvider读取内容?这似乎与你的应用程序无关,是不是因为FileProvider SecurityException不存在了?关键是,如果另一个应用程序不允许读取外部存储的权限,那么它会抛出这个exception@AlessandroRoaro-无论你使用什么样的接收应用程序,这看起来都是个问题。当然,如果它适用于单个URI情况,那么对多个URI情况下提供的数据的访问就没有区别——只是另一个应用程序的代码有所不同。使用普通URI而不是文件提供程序时也会发生这种情况。你得到了PermissionDenial例外
ClipData clipData = ClipData.newRawUri(null, imageUri);
clipData.addItem(new ClipData.Item(audioUri));
intent.setClipData(clipData);