为了账号安全,请及时绑定邮箱和手机立即绑定

请问如何使用支持FileProvider将内容分享给其他应用程序?

请问如何使用支持FileProvider将内容分享给其他应用程序?

Cats萌萌 2019-11-17 16:12:02
如何使用支持FileProvider将内容分享给其他应用程序?我正在寻找一种方法,使用Android支持库的FileProvider正确地与外部应用程序共享(而不是OPEN)内部文件。按照文档上的示例,<provider     android:name="android.support.v4.content.FileProvider"     android:authorities="com.example.android.supportv4.my_files"     android:grantUriPermissions="true"     android:exported="false">     <meta-data         android:name="android.support.FILE_PROVIDER_PATHS"         android:resource="@xml/my_paths" /></provider>并使用ShareCompat将文件共享给其他应用程序,如下所示:ShareCompat.IntentBuilder.from(activity).setStream(uri) // uri from FileProvider.setType("text/html").getIntent().addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)不起作用,因为FLAG_GRANT_READ_URI_PERMISSION仅授予data对intent 指定的Uri的权限,而不授予EXTRA_STREAMextra 的值(由set设置setStream)。我试图通过设置成安全android:exported到true的供应商,但FileProvider在内部检查,如果本身是出口,所以时,它抛出一个异常。
查看完整描述

2 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

使用FileProvider支持库,您必须手动授予和撤消其他应用程序读取特定Uri的权限(在运行时)。使用Context.grantUriPermission和Context.revokeUriPermission方法。

例如:

//grant permision for app with package "packegeName", eg. before starting other app via intentcontext.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);//revoke permisionscontext.revokeUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);

作为最后的手段,如果您无法提供包名称,则可以向所有可以处理特定意图的应用授予权限:

//grant permisions for all apps that can handle given intentIntent intent = new Intent();intent.setAction(Intent.ACTION_SEND);...List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);for (ResolveInfo resolveInfo : resInfoList) {
    String packageName = resolveInfo.activityInfo.packageName;
    context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);}

根据文档的替代方法:

  • 通过调用setData()将内容URI放入Intent中。

  • 接下来,使用FLAG_GRANT_READ_URI_PERMISSION或FLAG_GRANT_WRITE_URI_PERMISSION或两者调用方法Intent.setFlags()。

  • 最后,将Intent发送到另一个应用程序。通常,您通过调用setResult()来完成此操作。

    在接收活动的堆栈处于活动状态时,Intent中授予的权限仍然有效。堆栈完成后,将
    自动删除权限。授予
    客户端应用程序中一个活动的权限会自动扩展到
    该应用程序的其他组件。

顺便说一句。如果需要,可以复制FileProvider的源代码并更改attachInfo方法,以防止提供程序检查是否已导出。



查看完整回答
反对 回复 2019-11-18
  • 2 回答
  • 0 关注
  • 452 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信