【问题标题】:Android: Open private file with third party appAndroid:使用第三方应用打开私人文件
【发布时间】:2014-07-18 23:58:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: android


    【解决方案1】:

    你有两个选择。

    将应用注册为 FileProvider

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

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

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

    将文件保存在大容量存储单元(sdcard)中

    例如:

    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 访问文件,即使在您的应用程序被卸载后仍然可以使用这些文件,并且不将这些文件的“已用空间”计数添加到您的应用程序中,... “大容量存储单元方式”是要走的路。

    如果您希望将这些文件“绑定”到您的应用程序,仅在安装您的应用程序时可用,只能通过您的应用程序访问,...“FileProvider 方式”是要走的路。

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

    【讨论】:

    • 谢谢,我选择使用 SD 卡,使用 Context.getExternalDir(null) 获取应用程序公共存储。只是出于好奇,您的解决方法是如何工作的?
    • 解决方法基于:搜索可以处理意图的应用程序列表,然后向所有应用程序授予权限(一个一个)。它不是很漂亮(Android 应该已经集成了这个),但可以完成工作。
    • 拒绝访问以创建目录。虽然我已授予 READ_EXTERNAL_STORAGE 权限。根据 android doc,我们在 sdk 版本 >=19 中不需要 WRITE_EXTERNAL_STORAGE 权限。那么如何将文件存储在可以从该设备中的任何其他第三方应用程序访问的公共目录中?
    【解决方案2】:

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

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

    使用DownloadManager 与必须自己处理文件下载相比具有一些优势,并且在用户体验方面以更自然的方式集成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      相关资源
      最近更新 更多