返回

Android 适配 - FileProvider:应对新存储要求的利器

Android

为了满足 Google 的要求,Android 应用程序已经逐步适配了 Android 8.0 以上版本。本文将专门探讨我们在应用程序中遇到的适配问题和解决方案,其中重点介绍了 FileProvider 的使用。

适配的背景

Google 颁布了新的存储要求,旨在提升 Android 系统的安全性和隐私性。这些要求影响了应用程序访问文件的方式,从而引发了对 Android 8.0 及以上版本的适配需求。

FileProvider 的作用

FileProvider 是 Android 提供的一个内容提供器,允许应用程序安全地将文件共享给其他应用程序。在 Android 8.0 之前,应用程序可以通过直接访问文件路径来共享文件。然而,新的要求限制了这种做法,以防止应用程序访问用户未明确授予访问权限的文件。

FileProvider 通过创建一个受保护的文件符来解决这个问题。其他应用程序可以通过此符访问文件,而无需直接访问文件路径。

在应用程序中使用 FileProvider

在应用程序中使用 FileProvider 主要涉及以下步骤:

  1. 在 Android 清单文件中声明 FileProvider:
<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="com.example.myapp.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>
  1. res/xml 目录中创建一个名为 file_paths.xml 的文件,其中指定要共享的文件路径:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="files" path="." />
</paths>
  1. 在代码中使用 FileProvider 共享文件:
val fileUri = FileProvider.getUriForFile(context, "com.example.myapp.fileprovider", file)

实例演示

我们遇到的具体适配问题是共享外部存储上的图像文件。在 Android 8.0 之前,我们可以直接使用文件的绝对路径进行共享。然而,在新版本中,这种方法不再可行。

我们通过以下步骤解决了这个问题:

  1. 在 Android 清单文件中声明 FileProvider,指定要共享文件的路径。
  2. 在代码中使用 FileProvider 获取文件 URI。
  3. 使用文件 URI 通过意图共享文件。

总结

FileProvider 的使用是 Android 应用程序适配 Android 8.0 及以上版本时应对新存储要求的关键。通过创建受保护的文件描述符,FileProvider 允许应用程序安全地共享文件,同时遵守 Google 的存储安全性和隐私性要求。