返回

Android 7.0 行为变更:File Provider 适配指南

Android

导言

Android 7.0 Nougat 引入了 File Provider,这是一项重要变更,影响了应用程序与文件交互的方式。本文旨在提供一个全面的指南,帮助您了解这些变更并无缝地适配您的应用程序。

File Provider 简介

File Provider 是一种内容提供程序,允许应用程序安全地向其他应用程序共享文件。通过使用 File Provider,应用程序可以授予对特定文件或目录的临时访问权限,而无需公开整个文件系统。

Android 7.0 行为变更

在 Android 7.0 及更高版本中,以下与文件相关的行为发生了变更:

  • 权限模型更改: 不再允许应用程序使用读/写文件系统权限直接访问其他应用程序的数据。
  • 文件访问受限: 应用程序只能访问其专用的数据目录,除非通过 File Provider 授予显式访问权限。

适配 File Provider

为了适配这些变更,需要在应用程序中使用 File Provider。以下步骤将指导您完成此过程:

第一步:定义 File Provider

AndroidManifest.xml 文件中定义您的 File Provider:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>
  • android:authorities 此属性指定 File Provider 的授权字符串,应与您的应用程序 ID 匹配。
  • android:grantUriPermissions 此属性允许 File Provider 授予对共享文件的 URI 访问权限。
  • android:resource 此属性引用 file_paths.xml 文件,其中指定了要共享的文件路径。

第二步:指定可用文件

res/xml/file_paths.xml 文件中指定要共享的文件路径:

<paths>
    <files-path name="files" path="." />
</paths>
  • name 此属性指定文件路径的名称。
  • path 此属性指定文件的相对路径。

第三步:检索文件的 URI

使用 FileProvider.getUriForFile() 方法获取要共享文件的 URI:

Uri fileUri = FileProvider.getUriForFile(context, "${applicationId}.fileprovider", file);
  • context 上下文对象。
  • applicationId 与 File Provider 中 android:authorities 声明相匹配的应用程序 ID。
  • file 要共享的文件。

第四步:授予访问权限

使用 grantUriPermission() 方法授予其他应用程序对文件 URI 的访问权限:

context.grantUriPermission(packageName, fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
  • packageName 要授予访问权限的应用程序的包名。
  • fileUri 要授予访问权限的文件 URI。
  • Intent.FLAG_GRANT_READ_URI_PERMISSION 授予读取 URI 权限的标志。

最佳实践

适配 File Provider 时,请考虑以下最佳实践:

  • 限制对文件或目录的访问权限,仅共享绝对必要的资源。
  • 使用加密和身份验证机制保护共享文件。
  • 使用 File Provider API 管理文件访问权限。

结论

适配 Android 7.0 中的 File Provider 是确保应用程序与文件交互的安全性至关重要的一步。通过遵循本指南中的步骤,您可以无缝地过渡到新的权限模型,并继续为用户提供安全可靠的文件共享体验。