在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()`方法来读取文件。