android读取sdcard路径下的文件的方法


在Android中读取SD卡路径下的文件,你需要先确保你的应用有权限去访问外部存储。从Android 6.0(API 级别 23)开始,用户需要在运行时授予应用访问存储的权限。

以下是一个基本的步骤和示例代码,展示如何在Android中读取SD卡上的文件:

### 1. 添加权限到你的AndroidManifest.xml

确保你的`AndroidManifest.xml`文件中包含了必要的权限:


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

<!-- 如果你打算在Android 10(API 级别 29)及以上写入文件,你可能还需要 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="28" />
<application
    ...
    requestLegacyExternalStorage="true"> <!-- 适用于Android 10之前的版本,用于保持旧版行为 -->
    ...
</application>

注意:从Android 10开始,`requestLegacyExternalStorage`不再有效,你需要使用分区存储或请求媒体存储权限(`MEDIA_CONTENT_CONTROL` 或 `ACCESS_MEDIA_LOCATION`)。

### 2. 请求运行时权限

在你的Activity或Fragment中,请求用户授予权限。这通常在用户尝试执行需要该权限的操作之前进行。


if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {

    // 请求权限
    ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
}

### 3. 读取文件

一旦你有了权限,就可以使用`File`类或`MediaStore` API(推荐用于Android 10及以上)来访问和读取文件。

#### 使用File类(适用于旧版本Android)


File sdcard = Environment.getExternalStorageDirectory();
File file = new File(sdcard, "yourfile.txt");

StringBuilder text = new StringBuilder();

try (BufferedReader br = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = br.readLine()) != null) {
        text.append(line);
        text.append('\n');
    }
} catch (IOException e) {
    // 错误处理
}

// 使用text字符串

#### 使用MediaStore API(推荐用于Android 10及以上)


Uri collection = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
String[] projection = new String[]{
    MediaStore.Files.FileColumns._ID,
    MediaStore.Files.FileColumns.DISPLAY_NAME,
    MediaStore.Files.FileColumns.DATA
};
String selection = MediaStore.Files.FileColumns.DISPLAY_NAME + " = ?";
String[] selectionArgs = new String[]{"yourfile.txt"};

try (Cursor cursor = getContentResolver().query(collection, projection, selection, selectionArgs, null)) {
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID);
    if (cursor.moveToFirst()) {
        long id = cursor.getLong(column_index);
        Uri contentUri = ContentUris.withAppendedId(MediaStore.Files.getContentUri("external"), id);

        // 使用contentUri来读取文件内容
        InputStream stream = getContentResolver().openInputStream(contentUri);
        // ...读取流内容...
    }
}

注意:对于Android 10及以上版本,使用`MediaStore` API是推荐的方式,因为它不需要`WRITE_EXTERNAL_STORAGE`权限(仅用于写入),并且更加符合Google的隐私和安全标准。不过,请注意`DATA`列在Android 10及以上版本中可能不可用或为空,因此你需要使用`openInputStream()`方法来读取文件。