我正在制作一个从互联网下载文件的应用程序,并允许用户使用第三方应用程序打开这些文件。我使用getFilesDir()
将这些文件存储在我的私人应用程序目录中。
但是,似乎第三方应用无法访问这些文件,因为当我尝试打开它们时(使用第三方应用选择器,如this one),它无法打开该文件。我是否需要启用与其他应用共享文件的权限?
编辑:似乎使用File Provider
,您需要指定要为其提供访问权限的第三方应用的包名称。这是正确的,还是有解决方法来提供一般的第三方访问?
答案 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; /限制。