Android 11+如何通过MediaStore获取Micro SD卡媒体内容?
解决Android 11下MediaStore无法读取SD卡媒体内容的问题
1. 确认权限配置
Android 11访问MediaStore媒体文件需要READ_EXTERNAL_STORAGE权限,确保:
- 在
AndroidManifest.xml中声明权限:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> - 针对Android 6.0+(API 23)完成动态权限申请,该权限属于危险权限,必须获得用户授权后才能访问媒体内容。
2. 获取目标SD卡的存储卷名称
Android 11中每个外部存储设备(包括SD卡)对应唯一卷名称,需先获取该名称才能构造精准查询URI:
// 获取所有已挂载的外部存储卷名称 Set<String> volumeNames = MediaStore.getExternalVolumeNames(context.getContentResolver()); // 遍历找到对应SD卡的卷名(对应路径/mnt/media_rw/D26C-1EEF的卷名通常为D26C-1EEF) String targetVolumeName = null; for (String name : volumeNames) { Log.d("SD_CARD", "Volume name: " + name); if ("D26C-1EEF".equals(name)) { targetVolumeName = name; break; } }
3. 构造SD卡专属查询URI并执行查询
用目标卷名构造URI,直接查询该SD卡下的媒体内容:
if (targetVolumeName != null && contentResolver != null) { String sortOrder = MediaStore.Images.Media.DISPLAY_NAME + " ASC"; // 构造对应SD卡的URI Uri sdCardUri = MediaStore.Images.Media.getContentUri(targetVolumeName); Cursor cursor = contentResolver.query(sdCardUri, null, null, null, sortOrder); if (cursor != null) { Log.d("AMPS_LOGS", "SD卡媒体文件数量:" + cursor.getCount()); // 处理cursor数据,注意构造imageUri时要使用当前sdCardUri而非EXTERNAL_CONTENT_URI while (cursor.moveToNext()) { long imageId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)); Uri imageUri = ContentUris.withAppendedId(sdCardUri, imageId); String imageName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME)); String volumeName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.VOLUME_NAME)); // 其他字段处理逻辑... } cursor.close(); } }
4. 确保SD卡媒体文件已被系统索引
若SD卡刚插入或新复制了媒体文件,系统可能未完成媒体扫描,导致MediaStore无相关数据,可触发扫描:
// 扫描SD卡根目录下的媒体文件(可按需修改路径) MediaScannerConnection.scanFile(context, new String[]{"/mnt/media_rw/D26C-1EEF/"}, null, (path, uri) -> Log.d("SCAN", "扫描完成:" + path));
关键注意点
- 避免使用
MediaStore.EXTERNAL_CONTENT_URI,它默认指向内部存储的外部卷(VOLUME_EXTERNAL_PRIMARY),不包含SD卡内容。 - 构造媒体文件Uri时,必须使用对应SD卡的
sdCardUri,否则会指向错误存储位置。 - 确认SD卡处于正常挂载状态,未被加密或损坏,否则系统无法索引其内容。
内容的提问来源于stack exchange,提问作者windows 11
相关产品推荐
相关产品推荐

