猿问

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

如何使用支持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:exportedtrue的供应商,但FileProvider在内部检查,如果本身是出口,所以时,它抛出一个异常。


扬帆大鱼
浏览 2208回答 2
2回答

心有法竹

使用FileProvider支持库,您必须手动授予和撤消其他应用程序读取特定Uri的权限(在运行时)。使用Context.grantUriPermission和Context.revokeUriPermission方法。例如://grant&nbsp;permision&nbsp;for&nbsp;app&nbsp;with&nbsp;package&nbsp;"packegeName",&nbsp;eg.&nbsp;before&nbsp;starting&nbsp;other&nbsp;app&nbsp;via&nbsp;intentcontext.grantUriPermission(packageName,&nbsp;uri,&nbsp;Intent.FLAG_GRANT_WRITE_URI_PERMISSION&nbsp;|&nbsp;Intent.FLAG_GRANT_READ_URI_PERMISSION);//revoke&nbsp;permisionscontext.revokeUriPermission(uri,&nbsp;Intent.FLAG_GRANT_WRITE_URI_PERMISSION&nbsp;|&nbsp;Intent.FLAG_GRANT_READ_URI_PERMISSION);作为最后的手段,如果您无法提供包名称,则可以向所有可以处理特定意图的应用授予权限://grant&nbsp;permisions&nbsp;for&nbsp;all&nbsp;apps&nbsp;that&nbsp;can&nbsp;handle&nbsp;given&nbsp;intentIntent&nbsp;intent&nbsp;=&nbsp;new&nbsp;Intent();intent.setAction(Intent.ACTION_SEND);...List<ResolveInfo>&nbsp;resInfoList&nbsp;=&nbsp;context.getPackageManager().queryIntentActivities(intent,&nbsp;PackageManager.MATCH_DEFAULT_ONLY);for&nbsp;(ResolveInfo&nbsp;resolveInfo&nbsp;:&nbsp;resInfoList)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;packageName&nbsp;=&nbsp;resolveInfo.activityInfo.packageName; &nbsp;&nbsp;&nbsp;&nbsp;context.grantUriPermission(packageName,&nbsp;uri,&nbsp;Intent.FLAG_GRANT_WRITE_URI_PERMISSION&nbsp;|&nbsp;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方法,以防止提供程序检查是否已导出。
随时随地看视频慕课网APP

相关分类

Android
我要回答