【问题标题】:Send multiple files of different types via Intent using FileProvider使用 FileProvider 通过 Intent 发送多个不同类型的文件
【发布时间】: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 值所做的那样。

标签: android android-intent


【解决方案1】:

Forget the Storage Permission talkFLAG_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 中添加。

【讨论】:

  • 当使用剪辑数据时,我得到了这个异常:Writing exception to parcel java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/fs_id from pid=31664, uid=10062 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission(),我猜这与 Android Marshmallow 权限系统有关
  • @AlessandroRoaro - 所以其他应用程序正在尝试从 MediaProvider 读取?这似乎与您的应用程序无关,因为 FileProvider SecurityException 消失了?
  • 重点是如果其他app没有允许READ_EXTERNAL_STORAGE权限,那么就会抛出这个异常
  • @AlessandroRoaro - 无论您使用什么接收应用程序,这似乎都是一个问题。当然,如果它适用于单个 URI 情况,那么在访问您在多个 URI 情况下提供的数据方面没有区别 - 只是其他应用程序的代码有所不同。
  • 在使用普通 URI 而不是 FileProvider 时也会发生这种情况。你得到 PermissionDenial 异常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
相关资源
最近更新 更多