gpt4 book ai didi

android - 使用 FileProvider 通过 Intent 发送多个不同类型的文件

转载 作者:行者123 更新时间:2023-11-29 01:25:43 24 4
gpt4 key购买 nike

我想使用 FileProvider 通过 Intent 共享图像和音频文件。

当我尝试只发送两个文件之一(它们都有效)时它有效,但是当我传递一个包含两个文件的 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>

这就是我创建 Intent 的方式:

ArrayList<Uri> uris = new ArrayList<>();

// image file
Uri uri = FileProvider.getUriForFile(context, "com.mypackage.mybeautifulprovider", imageFile);
uris.add(uri);

// audio file
uri = FileProvider.getUriForFile(context, "com.mypackage.mybeautifulprovider", audioFile);
uris.add(uri);

Intent intent = new Intent();
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setAction(Intent.ACTION_SEND);
intent.setType("*/*");
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);

// start intent
....

最佳答案

Forget the Storage Permission talk 中所述, FLAG_GRANT_READ_URI_PERMISSIONFLAG_GRANT_WRITE_URI_PERMISSION 仅适用于 setData() 中设置的 URI。如果您需要多个 Uris,则需要将它们添加为 ClipData:

ClipData clipData = ClipData.newRawUri(null, imageUri);
clipData.addItem(new ClipData.Item(audioUri));
intent.setClipData(clipData);

请注意 setClipData()仅在 API 16 中添加。

关于android - 使用 FileProvider 通过 Intent 发送多个不同类型的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34208882/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com