Android 10 中读取外部存储文件

在 Android 10 及以上的版本中,由于 Google 对系统权限进行了更新,直接访问外部存储文件变得更加复杂。在本文中,我们将介绍如何在 Android 10 中读取外部存储文件,并提供相关的代码示例。

在 Android 10 中,应用需要请求运行时权限来读取外部存储文件。同时,由于 Scoped Storage 的引入,应用只能访问其私有目录和共享目录,而不能直接访问整个外部存储。

Scoped Storage

Scoped Storage 是 Android 10 中引入的一项新的存储模型,它为应用提供了隔离的存储空间,使得应用只能访问到自己的文件。这意味着应用无法再直接访问设备上的任何文件,包括外部存储中的文件。

读取外部存储文件的步骤

在 Android 10 中,要读取外部存储文件,需要经过以下步骤:

  1. 请求存储权限
  2. 使用 SAF(Storage Access Framework)来选择文件
  3. 读取选定的文件内容

接下来,我们将具体介绍如何实现这些步骤。

请求存储权限

在 AndroidManifest.xml 文件中添加以下权限请求:

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

然后,在运行时请求权限:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE);
}

使用 SAF 选择文件

可以通过 Intent 调用 SAF 来选择文件:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CODE);

在 onActivityResult 方法中获取选定文件的 URI:

if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
    Uri uri = data.getData();
}

读取选定文件的内容

最后,通过 ContentResolver 来读取文件的内容:

InputStream inputStream = getContentResolver().openInputStream(uri);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
    stringBuilder.append(line);
}
String content = stringBuilder.toString();

通过以上步骤,我们可以在 Android 10 中成功读取外部存储文件的内容。

状态图

下面是一个读取外部存储文件的状态图:

stateDiagram
    [*] --> RequestPermission
    RequestPermission --> PermissionGranted: Permission Granted
    PermissionGranted --> SelectFile: Select File
    SelectFile --> ReadFile: Read File
    ReadFile --> [*]: Finish

通过以上步骤和代码示例,我们可以在 Android 10 中成功读取外部存储文件的内容。只要按照规定的步骤来操作,就可以轻松实现文件读取功能。希望本文能对你有所帮助!