如何使用支持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
方法,以防止提供程序检查是否已导出。
- 2 回答
- 0 关注
- 452 浏览
添加回答
举报
0/150
提交
取消