返回

Android API ≤ 30 中如何将多个外部存储目录纳入备份?

Android

API ≤ 30 中包含多个外部存储目录进行 Android 备份

引言

在 Android API ≤ 30 中,将多个外部存储目录纳入备份规则可能会很棘手。虽然类似的规则在较新的 API 版本中可以正常工作,但在较旧的版本中,往往只能还原一个文件夹。本文将探讨造成此问题的原因并提供解决办法。

问题

默认情况下,API ≤ 30 中的 Android 备份规则对外部存储目录有限制。虽然可以包含多个目录,但备份代理程序有时只能还原其中一个。这可能导致重要数据的丢失,尤其是在将应用程序数据存储在外部存储上的情况下。

解决办法

要解决此问题,我们需要采取以下步骤:

  1. 创建自定义备份规则:

    创建自定义备份规则,明确指定要包含的每个外部存储目录。例如:

    <?xml version="1.0" encoding="utf-8"?>
    <full-backup-content>
        <include domain="external" path="/storage/emulated/0/Android/data/com.example.myapp/files/themes" />
        <include domain="external" path="/storage/emulated/0/Android/data/com.example.myapp/files/fonts" />
    </full-backup-content>
    
  2. 使用 FileProvider:

    使用 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/filepaths" />
    </provider>
    
  3. 创建 filepaths.xml 文件:

    在 res/xml 目录中创建 filepaths.xml 文件,并指定要授予访问权限的外部存储目录。例如:

    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <files-path name="themes" path="/storage/emulated/0/Android/data/com.example.myapp/files/themes" />
        <files-path name="fonts" path="/storage/emulated/0/Android/data/com.example.myapp/files/fonts" />
    </paths>
    
  4. 在备份规则中使用 FileProvider 权限:

    在自定义备份规则中,使用 FileProvider 权限将外部存储目录包含在内。例如:

    <?xml version="1.0" encoding="utf-8"?>
    <full-backup-content>
        <include domain="external" path="/storage/emulated/0/Android/data/com.example.myapp/files/themes" flags="android:protectAll" />
        <include domain="external" path="/storage/emulated/0/Android/data/com.example.myapp/files/fonts" flags="android:protectAll" />
    </full-backup-content>
    

其他注意事项

  • 确保外部存储目录的权限设置允许备份代理程序访问。
  • 测试备份和还原过程,以确保所有预期目录都已正确包含和还原。
  • 如果遇到问题,请查阅 Android 文档或在开发人员论坛上寻求帮助。

常见问题解答

Q1:为什么需要自定义备份规则?

默认的备份规则对外部存储目录的数量有限制,自定义备份规则允许我们明确指定要包含的目录。

Q2:FileProvider 如何帮助解决这个问题?

FileProvider 授予备份代理程序访问外部存储目录的权限,从而允许其备份和还原这些目录中的数据。

Q3:我是否需要为每个外部存储目录创建 FileProvider 权限?

是的,为每个需要包含在备份中的外部存储目录创建一个 FileProvider 权限非常重要。

Q4:我如何确保备份和还原过程正常工作?

通过测试备份和还原过程,我们可以确保所有预期目录都已正确包含和还原,并及时发现任何潜在问题。

Q5:除了本文介绍的解决方案外,还有其他方法可以解决此问题吗?

其他潜在解决方案包括使用 SharedPreferences、内容提供程序或云存储来存储外部存储数据,但这些方法可能不适合所有情况。