Android 高版本读取 Storage 文件指南

在 Android 开发中,读取存储文件是一个基本且常见的任务。特别是在 Android 6.0(API 23)及更高版本中,Google 引入了运行时权限管理,使得文件访问变得更加复杂。本文将为你逐步指导如何在 Android 中读取存储文件。

实现流程

下面的表格概述了我们需要实施的每个步骤:

步骤 描述
1 添加必要的权限
2 请求运行时权限
3 读取文件内容
4 处理读取结果

流程图

flowchart TD
    A[开始] --> B[添加必要的权限]
    B --> C[请求运行时权限]
    C --> D[读取文件内容]
    D --> E[处理读取结果]
    E --> F[结束]

每一步的详细代码说明

1. 添加必要的权限

在你的 AndroidManifest.xml 文件中添加读取外部存储的权限:

<manifest xmlns:android="
    package="com.example.storageaccess">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

代码说明:

  • uses-permission 标签用于声明我们的应用需要访问外部存储的权限。

2. 请求运行时权限

MainActivity.java 中请求用户的权限:

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CODE_READ_EXTERNAL_STORAGE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 检查权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            // 请求权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    REQUEST_CODE_READ_EXTERNAL_STORAGE);
        } else {
            // 权限已被授予,继续读取文件
            readFile();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        if (requestCode == REQUEST_CODE_READ_EXTERNAL_STORAGE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限授予,继续读取文件
                readFile();
            } else {
                // 权限被拒绝
                // 可选择展示一个提示,说明为什么需要这个权限
            }
        }
    }

    private void readFile() {
        // 文件读取逻辑
    }
}

代码说明:

  • 我们使用 ContextCompat.checkSelfPermission() 检查用户是否已授予权限。
  • 如果未授予权限,使用 ActivityCompat.requestPermissions() 请求权限。
  • onRequestPermissionsResult() 回调中处理授予或拒绝权限的结果。

3. 读取文件内容

添加读取文件的逻辑。你可以选择从特定路径读取文件,例如 Documents 文件夹中的文件:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

private void readFile() {
    String filePath = "/storage/emulated/0/Documents/sample.txt"; // 确保文件路径正确
    StringBuilder text = new StringBuilder();

    try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
        String line;
        while ((line = br.readLine()) != null) {
            text.append(line);
        }
        // 最后输出文件内容
        System.out.println(text.toString());
    } catch (IOException e) {
        e.printStackTrace();
        // 处理异常情况
    }
}

代码说明:

  • 我们使用 BufferedReaderFileReader 来读取文件的内容。
  • 路径可能需要根据你的设备和文件位置进行调整。

4. 处理读取结果

readFile 方法中,你可以使用 TextView 显示读取的文本内容,或者在 UI 中进行其他处理。

import android.widget.TextView;

private void readFile() {
    String filePath = "/storage/emulated/0/Documents/sample.txt"; 
    StringBuilder text = new StringBuilder();

    try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
        String line;
        while ((line = br.readLine()) != null) {
            text.append(line).append('\n');
        }
        // 显示文件内容到TextView
        TextView textView = findViewById(R.id.textView);
        textView.setText(text.toString());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

代码说明:

  • 在读取完成后,我们利用 TextView 将内容显示在 UI 上。

状态图

stateDiagram
    [*] --> 检查权限
    检查权限 --> 权限未授予
    权限未授予 --> 请求权限
    请求权限 --> [*]
    
    检查权限 --> 权限已授予
    权限已授予 --> 读取文件内容
    读取文件内容 --> [*]

结论

通过以上步骤,我们成功地实现了在 Android 高版本中读取存储下的文件。从添加权限到请求权限,最后显示文件内容,每一步都至关重要。确保你已正确设置文件路径、处理权限逻辑,并使用能在设备上实际访问的文件。如果在实施过程中遇到任何问题,查看 Android 文档和最佳实践是个不错的主意。祝你顺利完成你的 Android 项目!