Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用FileProvider通过Intent发送多个不同类型的文件_Android_Android Intent - Fatal编程技术网

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);