Android:使用第三方应用打开私人文件

时间:2014-07-18 23:58:50

标签: android

我正在制作一个从互联网下载文件的应用程序,并允许用户使用第三方应用程序打开这些文件。我使用getFilesDir()将这些文件存储在我的私人应用程序目录中。

但是,似乎第三方应用无法访问这些文件,因为当我尝试打开它们时(使用第三方应用选择器,如this one),它无法打开该文件。我是否需要启用与其他应用共享文件的权限?

编辑:似乎使用File Provider,您需要指定要为其提供访问权限的第三方应用的包名称。这是正确的,还是有解决方法来提供一般的第三方访问?

2 个答案:

答案 0 :(得分:1)

在这种情况下,建议的做法是让您的应用充当FileProvider,授予您对第三方应用程序的临时文件访问权。

或者,您可以使用DownloadManager组件下载文件并将其保留在设备上的特定位置。如果您要下载的文件不是您应用程序的私有文件,并且您希望第三方组件可以永久访问这些文件,请使用下载管理器对下载的文件进行媒体扫描,这样就可以通过MediaStore到其他应用。

使用DownloadManager提供了一些优势,而不是自己处理文件下载,并以更自然的方式集成用户体验。

答案 1 :(得分:1)

您有两种选择。

将应用注册为FileProvider

您在Android文档中有一个完整且更新的示例:https://developer.android.com/reference/android/support/v4/content/FileProvider.html

如果您想提供对任何第三方应用的访问权限,可以使用此解决方法:

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);
}

将文件保存在大容量存储单元(SD卡)

例如:

File sdCard = Environment.getExternalStorageDirectory();
File dir = new File (sdCard.getAbsolutePath() + "/newDir");
dir.mkdirs();
File file = new File(dir, "filename");

FileOutputStream f = new FileOutputStream(file);
...

选择哪一个

这取决于你的目标。

如果您希望用户可以通过USB访问这些文件,即使在您的应用程序被卸载后也可以使用它们,以便没有使用过的空间&#34;添加到您应用程序的那些文件的数量,...&#34;大容量存储单元方式&#34;是要走的路。

如果您希望这些文件被&#34;捆绑&#34;到您的应用程序,仅在您的应用程序安装时可用,只能通过您的应用程序访问,...&#34; FileProvider方式&#34;是要走的路。

在Android中,&#34;大容量存储单元方式&#34;如果它不是明智的数据,似乎更可取。 Android用户不喜欢&#34;链和#34; /限制。