Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android上的应用程序之间共享文件。除了ContentProvider,还有什么好的选择吗?_Android_Android Contentprovider_Android Permissions - Fatal编程技术网

在Android上的应用程序之间共享文件。除了ContentProvider,还有什么好的选择吗?

在Android上的应用程序之间共享文件。除了ContentProvider,还有什么好的选择吗?,android,android-contentprovider,android-permissions,Android,Android Contentprovider,Android Permissions,我正在寻找一种在以下场景中运行的应用程序之间共享文件的方法: 在我们的应用程序中,有一个文件列表。用户单击共享按钮,我们向他显示选择对话框,其中显示可以获取文件的应用程序列表。例如,用户可以选择Gmail,创建信件并将选定文件附加到此信件,或者用户可以通过蓝牙传输文件 该文件可以位于我们应用程序的私有目录中 文件可以位于文件系统中的任何位置,但需要根访问权限的目录除外 接收文件的应用程序可能没有读取外部存储的权限 它应该从API级别14开始工作,直到最新版本 据我所知,满足所有条件的唯一方法

我正在寻找一种在以下场景中运行的应用程序之间共享文件的方法:

  • 在我们的应用程序中,有一个文件列表。用户单击共享按钮,我们向他显示选择对话框,其中显示可以获取文件的应用程序列表。例如,用户可以选择Gmail,创建信件并将选定文件附加到此信件,或者用户可以通过蓝牙传输文件
  • 该文件可以位于我们应用程序的私有目录中
  • 文件可以位于文件系统中的任何位置,但需要根访问权限的目录除外
  • 接收文件的应用程序可能没有读取外部存储的权限
  • 它应该从API级别14开始工作,直到最新版本
据我所知,满足所有条件的唯一方法是在我的应用程序中实现自定义
ContentProvider
FileProvider
ContentProvider
将给出文件的内容URI,我们将该URI附加到
操作共享
意图,并带有
标志\u GRANT\u READ\u URI\u PERMISSION


我担心我错过了其他一些简单而干净的解决方案。是否存在ContentProvider的其他可靠替代品?如果存在,它是什么?

因此,我在
FileProvider
中发现了一个未记录的功能,允许您在设备上的任何位置共享文件。它是
根路径
元素:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <root-path name="my_root"/>
</paths>


使用
根路径
时,
文件提供程序
完全满足我的所有要求。实现只需要十几行,
FileProvider
是一个优秀的组件。

因此,我在
FileProvider
中发现了一个未记录的功能,允许您从设备上的任何位置共享文件。它是
根路径
元素:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <root-path name="my_root"/>
</paths>


使用
根路径
时,
文件提供程序
完全满足我的所有要求。实现只需要十几行,
FileProvider
是一个优秀的组件。

为您的场景使用basic
FileProvider
需要两行Java代码,一个四行XML文件,清单中不到十几行。您希望得到多简单?@commonware感谢您之前的回复。我没有仔细研究过文件提供者的需求,但我看到了一些内容提供者,按照我的口味,它们需要大量的样板代码。然而,我可以使用它,只是对其他方式有一些完美主义者的好奇心。抱歉,如果我打扰了。实现
ContentProvider
会让人恼火<代码>文件提供程序已实现。您可以直接使用它,或者将其子类化以进行次要的兼容性修复(例如,我使用的方法有一个三行方法,就是这样)。诚然,
FileProvider
不一定涵盖场景中的所有内容。值得注意的是,您无法将
FileProvider
与可移动存储一起使用,因为您在编译时不知道路径。@Commonware是的,FileProvider中的可移动存储路径是我接下来要研究的问题。我认为有一种方法可以在FileProvider中包含从“/”开始的所有内容,但如果没有,那么我将实现自定义ContentProvider,或者尝试覆盖FileProvider行为。再次感谢您,如果您添加您的评论作为回答,我将接受这两个问题。“我认为有某种方法可以将从“/”开始的所有内容都包含在FileProvider中——不,您仅限于应用程序内部存储部分的根目录,以及外部存储。“我将实现自定义ContentProvider,或尝试覆盖FileProvider行为”--我考虑过向(增强的
FileProvider
)添加可移动存储支持,但我还没有,抱歉。我的评论并没有真正回答所写的问题,因为您正在寻找除
FileProvider
之外的其他选项。在您的场景中使用basic
FileProvider
需要两行Java代码,一个四行XML文件,清单中不到十几行。您希望得到多简单?@commonware感谢您之前的回复。我没有仔细研究过文件提供者的需求,但我看到了一些内容提供者,按照我的口味,它们需要大量的样板代码。然而,我可以使用它,只是对其他方式有一些完美主义者的好奇心。抱歉,如果我打扰了。实现
ContentProvider
会让人恼火<代码>文件提供程序已实现。您可以直接使用它,或者将其子类化以进行次要的兼容性修复(例如,我使用的方法有一个三行方法,就是这样)。诚然,
FileProvider
不一定涵盖场景中的所有内容。值得注意的是,您无法将
FileProvider
与可移动存储一起使用,因为您在编译时不知道路径。@Commonware是的,FileProvider中的可移动存储路径是我接下来要研究的问题。我认为有一种方法可以在FileProvider中包含从“/”开始的所有内容,但如果没有,那么我将实现自定义ContentProvider,或者尝试覆盖FileProvider行为。再次感谢您,如果您添加您的评论作为回答,我将接受这两个问题。“我认为有某种方法可以将从“/”开始的所有内容都包含在FileProvider中——不,您仅限于应用程序内部存储部分的根目录,以及外部存储。“我将实现自定义ContentProvider,或尝试覆盖FileProvider行为”--我考虑过向(增强的
FileProvider
)添加可移动存储支持,但我还没有,抱歉。而且我的评论并没有像我写的那样真正回答这个问题,因为您正在寻找
FileProvider
之外的选项。