【发布时间】:2015-12-10 18:12:30
【问题描述】:
我想通过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>
这就是我创建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
....
【问题讨论】:
-
使用
ACTION_SEND_MULTIPLE发送多个内容,而不是ACTION_SEND。即使您解决了权限问题,客户也不会期望在EXTRA_STREAM中使用ACTION_SEND中的数组。 -
当我尝试使用
ACTION_SEND_MULTIPLE时,接收应用程序抛出此异常:java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{efa0d77 24711:com.google.android.gm/u0a64} (pid=24711, uid=10064) that is not exported from uid 10105 -
嗯...我希望
Intent标志会波及ACTION_SEND_MULTIPLE的数组元素,就像它们对ACTION_SEND中的单个Uri值所做的那样。