【问题标题】:Why use FileProvider for external files?为什么将 FileProvider 用于外部文件?
【发布时间】:2023-03-10 10:48:01
【问题描述】:

我理解为什么 FileProvider 可用于与另一个应用共享一个应用的私有文件(应用内部存储中的文件),同时控制权限。

文档解释了如何使用它来共享外部存储(SD 卡等)中的文件:

<external-path name="name" path="path" />

而不是

<files-path name="name" path="path" />

(https://developer.android.com/reference/android/support/v4/content/FileProvider.html)

这有什么意义?为什么需要为此使用 FileProvider?另一个应用程序已经可以访问外部存储,因此任何其他应用程序都需要文件路径,而不是 URI。我错过了什么?

【问题讨论】:

    标签: android android-contentprovider android-file android-fileprovider


    【解决方案1】:

    其他应用已经可以访问外部存储

    不一定。如果他们不持有READ_EXTERNAL_STORAGE 或WRITE_EXTERNAL_STORAGE 权限,则他们无权访问外部存储。

    此外,如果某个时间点对外部存储有更大的限制(例如,Android Work 计划中的“工作”和“家庭”部分),我也不会感到惊讶,其中一个应用程序对外部存储的视图storage 不同于另一个应用程序对外部存储的看法,即使在逻辑上是同一个用户。然后,即使“工作”应用程序具有正确的权限,它也可能无法看到“家庭”应用程序放在外部存储上的文件,除非“家庭”应用程序通过ContentProvider 为他们提供服务,例如@987654324 @。

    【讨论】:

    • 好的,这很有意义。但无论如何,我仍然可以浏览目录(如果我知道它的位置)并自己找到所有文件,对吧?内部存储文件并非如此:“保存到内部存储的文件对您的应用程序是私有的,其他应用程序无法访问它们(用户也不能)”
    • @MikeMiller:“我仍然可以浏览目录(如果我知道它的位置)并自己找到所有文件,对吧?” ——我不知道那句话中的“我”是谁。如果“我”是迈克米勒,一个人类,那么是的,至少对于今天的设备,并且可能在未来。但请记住,Android 4.2+ 平板电脑支持多个帐户,并且一个帐户用户无法查看另一个帐户用户的文件,因为它们具有不同的内部和外部存储位置。
    • @MikeMiller:如果你不是人类,我很抱歉。我首先欢迎我们的新$SPECIES 霸主。 :-)
    【解决方案2】:

    Android 4.4 中的一项更改与storage permission changes 有关:

    您的应用在 Android 4.4 上运行时无法读取外部存储上的共享文件,除非您的应用拥有READ_EXTERNAL_STORAGE 权限。即getExternalStoragePublicDirectory()返回的目录内的文件,在没有权限的情况下是无法访问的。

    但是,如果您通过 FileProvider 提供文件,则您的应用可以获得权限,而其他应用不需要知道文件的位置。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 2021-06-20
      相关资源
      最近更新 更多