当前位置: 首页 > 知识库问答 >
问题:

如何使用support FileProvider将内容共享到其他应用程序?

章越
2023-03-14
<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.IntentBuilder.from(activity)
.setStream(uri) // uri from FileProvider
.setType("text/html")
.getIntent()
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

我试图通过将提供程序的android:exported设置为true来破坏安全性,但是fileprovider会在内部检查自己是否导出,如果导出了,它会抛出一个异常。

共有1个答案

葛飞扬
2023-03-14

使用支持库中的fileprovider,您必须(在运行时)手动授予和撤销其他应用程序读取特定URI的权限。使用Context.GranturiPermission和Context.RevokeuriPermission方法。

例如:

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

//revoke permisions
context.revokeUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);

作为最后一个办法,如果您不能提供包名,您可以授予所有可以处理特定意图的应用程序权限:

//grant permisions for all apps that can handle given intent
Intent 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);
}
 类似资料:
  • 我想用SharingContent将声音从原始文件夹共享到另一个应用程序 我使用此代码共享文本和字符串

  • 首先请不要把这个问题当作重复的问题。所有其他问题都是旧的,我已经尝试了其中大多数的解决方案,但没有一个奏效。 我正在开发一个Android应用程序,我已经将我的应用程序添加到共享Android菜单中。我想添加功能,这样如果用户在共享列表上单击我的应用,例如在Chrome浏览器或Google Drive应用中,我的应用将从该应用接收数据,例如从Chrome it wold URL。 我尝试过使用不同

  • 当我通过youtube应用程序从移动设备分享一个youtube视频到Whatsapp时,它会显示一个带有链接的缩略图,是否可以像这样在Whatsapp上分享这个视频范围漫游者视频,当我去Whatsapp时,它看起来是这样的,我想在我的flutter应用程序中使用这个,有什么想法吗?

  • 在我们的应用程序中,我们发现有必要通过另一个应用程序的意图从我们的内部存储中打开文档。即打开我们内部存储在用户选择的默认pdf阅读器中的pdf。 在清单中,我将应用程序设置为提供程序,在我们的Provider类中,我实现了调用的openFile(Uri uri, String模式)方法,并且不会抛出FileNotFoundException。 我已经验证了该文件是否存在于预期的位置-并且意图不为空

  • 问题内容: 我有一个正在运行的Flask应用程序,该应用程序是根据我们在网上和Miguel Grinberg的“ Flask Web开发”书中找到的最佳实践组合设置的。 现在,我们需要第二个Python应用程序,它不是Web应用程序,并且需要访问与Flask应用程序相同的模型。我们想重复使用相同的课程模型,因此两个应用程序都可以从共享代码中受益。 我们删除了关于flask- sqlalchemy扩