保存文件不被删除的实现流程

作为一名经验丰富的开发者,我将向你介绍如何实现在Android 11上保存文件不被删除的方法。下面是整个实现流程的概述:

  1. 检查文件保存权限:在AndroidManifest.xml文件中添加WRITE_EXTERNAL_STORAGE权限,以便应用可以访问外部存储空间。

  2. 使用新的存储访问框架(Scoped Storage):在Android 11及以后的版本中,Google引入了新的存储访问框架,以增强应用对用户数据的保护。在使用文件保存功能之前,我们需要适配新的存储访问框架。

  3. 创建文件:使用File类或者DocumentFile类创建文件。File类用于读写应用内部存储,DocumentFile类用于读写外部存储。

  4. 保存文件:将文件保存到应用内部存储或外部存储,并确保文件路径正确。

  5. 撤销文件保存:如果用户不再需要保存的文件,可以使用MediaStore API进行撤销操作,将文件从媒体库中删除。

下面详细介绍每一步需要做什么,并给出相应的代码示例:

1. 检查文件保存权限

在AndroidManifest.xml文件中添加WRITE_EXTERNAL_STORAGE权限,以便应用可以访问外部存储空间。请在该文件的<manifest>标签中添加以下代码:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. 使用新的存储访问框架

在Android 11及以后的版本中,我们需要适配新的存储访问框架。首先,在build.gradle文件中添加以下代码,以使用最新的存储访问库:

implementation 'androidx.documentfile:documentfile:1.0.1'

然后,在应用的启动Activity中,添加以下代码以确保应用正确处理存储访问权限:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivity(intent);
}

该代码会打开应用的设置页面,用户可以在此处授予应用访问存储空间的权限。

3. 创建文件

在Android 11中,使用File类或者DocumentFile类创建文件。File类用于读写应用内部存储,DocumentFile类用于读写外部存储。以下是创建文件的示例代码:

使用File类创建文件

File file = new File(getFilesDir(), "example.txt");

使用DocumentFile类创建文件

Uri uri = MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL);
DocumentFile dir = DocumentFile.fromTreeUri(context, uri);
DocumentFile file = dir.createFile("text/plain", "example.txt");

4. 保存文件

将文件保存到应用内部存储或外部存储,并确保文件路径正确。以下是保存文件的示例代码:

保存到应用内部存储

try {
    FileOutputStream fos = openFileOutput("example.txt", Context.MODE_PRIVATE);
    fos.write("Hello, World!".getBytes());
    fos.close();
} catch (IOException e) {
    e.printStackTrace();
}

保存到外部存储

try {
    OutputStream os = getContentResolver().openOutputStream(file.getUri());
    os.write("Hello, World!".getBytes());
    os.close();
} catch (IOException e) {
    e.printStackTrace();
}

5. 撤销文件保存

如果用户不再需要保存的文件,可以使用MediaStore API进行撤销操作,将文件从媒体库中删除。以下是撤销文件保存的示例代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    MediaStore.createDeleteRequest(getContentResolver(), file.getUri()).execute();
}

通过上述步骤,你可以实现在Android 11上保存文件不被删除的功能。记得在使用新的存储访问框架时进行适配,确保应用可以正常访问存储空间。