Android 10 不用申请写权限的实现方法

作为一名经验丰富的开发者,我经常被问到如何在Android 10及以上版本中实现无需申请写权限的功能。在这篇文章中,我将详细解释这一过程,并提供代码示例和注释,帮助刚入行的小白快速掌握。

1. 准备工作

在开始之前,我们需要确保已经安装了Android Studio,并创建了一个Android项目。此外,我们还需要确保项目的build.gradle文件中设置了正确的minSdkVersiontargetSdkVersion

android {
    compileSdkVersion 30
    defaultConfig {
        minSdkVersion 23
        targetSdkVersion 30
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

2. 检查存储访问框架

在Android 10及以上版本中,Google引入了新的存储访问框架(Storage Access Framework,SAF),允许应用在不需要写权限的情况下访问文件。首先,我们需要检查设备是否支持SAF:

boolean isSAFSupported = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q;
  • 1.

3. 使用SAF访问文件

如果设备支持SAF,我们可以使用ACTION_OPEN_DOCUMENT Intent来打开文件选择器,让用户选择文件:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*"); // 选择所有类型的文件
startActivityForResult(intent, REQUEST_CODE);
  • 1.
  • 2.
  • 3.
  • 4.

这里的REQUEST_CODE是一个自定义的整数值,用于在onActivityResult方法中识别请求。

4. 处理选择结果

onActivityResult方法中,我们需要处理用户选择的文件,并获取其URI:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null) {
        Uri uri = data.getData();
        // 使用uri访问文件
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

5. 使用ContentResolver访问文件

获取到文件的URI后,我们可以使用ContentResolver来访问文件内容:

ContentResolver resolver = getContentResolver();
InputStream inputStream = null;
try {
    inputStream = resolver.openInputStream(uri);
    // 读取文件内容
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (inputStream != null) {
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

6. 序列图

下面是一个使用mermaid语法表示的序列图,展示了整个流程:

File System Storage Access Framework App User File System Storage Access Framework App User 选择文件 请求访问文件 获取文件URI 返回文件URI 返回文件URI 使用ContentResolver访问文件 读取文件内容

7. 结语

通过使用Android 10引入的存储访问框架,我们可以在不需要申请写权限的情况下访问文件。这种方法不仅提高了应用的安全性,还简化了开发过程。希望这篇文章能帮助刚入行的小白快速掌握这一技能,为开发更安全、更高效的Android应用打下基础。