如何在Android模拟器中获取SD卡内文件夹路径并访问内容
解决Android模拟器无法访问SD卡中BiometricImages文件夹内容的问题
核心原因
模拟器的外部存储挂载逻辑、权限机制和真实设备存在差异,尤其是Android 10及以上的分区存储特性,会限制APP直接访问非自身创建的外部目录。另外你用的getExternalFilesDir()是获取APP私有外部存储目录,和手动在SD卡根目录创建的BiometricImages并非同一路径。
具体解决步骤
1. 确认模拟器SD卡实际路径
打开模拟器文件管理器,找到BiometricImages文件夹,查看完整路径。通常模拟器外部存储挂载在/storage/emulated/0/,部分模拟器可能映射到/storage/sdcard0/,需以实际路径为准。
2. 适配分区存储(Android 10+)
若APP目标SDK为30及以上,默认启用分区存储,无法直接访问外部根目录自定义文件夹,可二选一处理:
- 用媒体库API查询图片:通过
MediaStore指定目录查询jpg文件:
val projection = arrayOf(MediaStore.Images.Media.DATA) val selection = "${MediaStore.Images.Media.RELATIVE_PATH} LIKE ?" val selectionArgs = arrayOf("%BiometricImages%") val cursor = contentResolver.query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs, null ) val imagePaths = mutableListOf<String>() cursor?.use { while (it.moveToNext()) { val path = it.getString(it.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)) imagePaths.add(path) } }
- 临时关闭分区存储(仅适用于目标SDK 29-30,Android 11+部分场景失效):在
AndroidManifest.xml中添加配置:
<application ... android:requestLegacyExternalStorage="true"> ... </application>
3. 检查权限配置
确保已申请并授予外部存储访问权限:
- 在
AndroidManifest.xml声明权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 13+ 需单独申请图片权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
- 代码中动态申请权限(Android 6.0+):
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1001) }
4. 修正路径获取逻辑
避免硬拼接路径,改用安全的文件对象方式获取目录:
val biometricDir = File(Environment.getExternalStorageDirectory(), "BiometricImages") if (biometricDir.exists()) { val images = biometricDir.listFiles { file -> file.extension.equals("jpg", ignoreCase = true) }?.toList() ?: emptyList() }
5. 模拟器特殊设置
- 重启模拟器,确保SD卡挂载状态正常;
- 检查模拟器是否开启“模拟SD卡”功能,部分模拟器需手动配置SD卡容量才能正常使用外部存储。
内容的提问来源于stack exchange,提问作者Ben Ajax
相关产品推荐
相关产品推荐

