Android 共享目录 不再需要权限实现流程
概述
在Android系统中,为了保护用户的隐私和数据安全,应用程序默认不能直接访问外部存储器上的文件。在Android 4.4之前,开发者需要在AndroidManifest.xml文件中声明读写外部存储器的权限,并且在运行时需要向用户请求授权。但自Android 4.4起,Google引入了存储访问框架(Storage Access Framework,简称SAF),使得应用程序可以通过系统提供的框架来访问外部存储器上的文件,而不再需要申请权限。
实现步骤
下面是实现Android共享目录不再需要权限的步骤:
步骤 | 描述 |
---|---|
1 | 启动SAF文件选择器 |
2 | 处理文件选择结果 |
3 | 读写文件 |
接下来,我们将逐步介绍每个步骤需要做的事情,并给出相应的代码示例。
步骤一:启动SAF文件选择器
SAF文件选择器是Android系统提供的一个界面,用于让用户选择外部存储器上的文件,开发者可以通过调用系统提供的Intent来启动该界面,并指定需要的文件类型。以下是代码示例:
// 创建Intent对象,指定action为ACTION_OPEN_DOCUMENT
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
// 设置文件类型为任意文件
intent.setType("*/*");
// 启动SAF文件选择器
startActivityForResult(intent, REQUEST_CODE);
步骤二:处理文件选择结果
当用户在SAF文件选择器中选择了文件后,Android系统会将选择的文件的URI返回给应用程序。开发者需要在Activity的onActivityResult方法中处理这个返回值,并获取文件的URI。以下是代码示例:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
// 获取选中文件的URI
Uri uri = data.getData();
// 处理文件
handleFile(uri);
}
}
步骤三:读写文件
在获取到文件的URI后,开发者可以通过ContentResolver来读写文件。以下是代码示例:
private void handleFile(Uri uri) {
try {
// 打开文件的输入流
InputStream inputStream = getContentResolver().openInputStream(uri);
// 读取文件内容
// ...
// 关闭输入流
inputStream.close();
// 打开文件的输出流
OutputStream outputStream = getContentResolver().openOutputStream(uri);
// 写入文件内容
// ...
// 关闭输出流
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
以上代码示例中,我们使用了ContentResolver的openInputStream方法和openOutputStream方法来分别打开文件的输入流和输出流,然后可以像操作普通文件一样读取和写入文件内容。
甘特图
下面是使用mermaid语法绘制的甘特图,展示了实现Android共享目录不再需要权限的过程:
gantt
dateFormat YYYY-MM-DD
title 实现Android共享目录不再需要权限
section 启动SAF文件选择器
开始 :2022-01-01, 1d
完成 :2022-01-01, 1d
section 处理文件选择结果
开始 :2022-01-02, 1d
完成 :2022-01-02, 1d
section 读写文件
开始 :2022-01-03, 1d
完成 :2022-01-03, 1d
以上是实现Android共享目录不再需要权限的完整流程及相应的代码示例。通过使用SAF文件选择器和ContentResolver,开发者可以方便地实现对外部存储器上文件的读写操作,而无需申请权限。希望这篇文章对刚入行的小白有所帮助。