如何获取Android应用存储路径?求适配6.0获取storage/emulated/0的方案
解决方案:Android获取
/storage/emulated/0格式的存储路径 我之前也踩过Android不同版本存储API的坑,尤其是6.0引入的动态权限机制,确实容易导致路径获取返回null的问题。针对你的需求,我整理了一套可靠的解决方案:
一、先明确术语(避免混淆)
你提到的/storage/emulated/0其实是公共外部存储的根目录,Android系统中:
- 「内部存储」指应用私有目录(路径类似
/data/data/你的包名/),只有当前应用可访问 - 「公共外部存储」就是你要的
/storage/emulated/0,所有应用(有权限)都可访问,也是用户在文件管理器里看到的“内部存储”根目录
二、核心解决方案步骤
1. 配置Manifest静态权限
首先在AndroidManifest.xml中添加存储权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 如果你要兼容Android 10+,还需添加分区存储相关配置,但你的问题是6.0,暂时不需要 -->
2. 动态申请权限(Android 6.0+ 必需)
Android 6.0(API 23)开始,存储权限属于「危险权限」,必须在运行时向用户申请,否则调用存储API会返回null或抛出异常。以下是示例代码:
private static final int STORAGE_PERMISSION_REQUEST_CODE = 101; // 检查是否已获取存储权限 private boolean hasStoragePermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int readPerm = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE); int writePerm = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); return readPerm == PackageManager.PERMISSION_GRANTED && writePerm == PackageManager.PERMISSION_GRANTED; } // 6.0以下默认已授予权限 return true; } // 请求存储权限 private void requestStoragePermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSION_REQUEST_CODE ); } } // 处理权限申请结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == STORAGE_PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限获取成功,现在可以获取路径了 getStorageRootPath(); } else { // 用户拒绝权限,提示用户开启权限 Toast.makeText(this, "需要存储权限才能获取存储路径", Toast.LENGTH_SHORT).show(); } } }
3. 获取目标路径
权限验证通过后,调用系统API获取路径:
private void getStorageRootPath() { // 获取公共外部存储根目录,也就是你要的/storage/emulated/0 String storageRootPath = Environment.getExternalStorageDirectory().getAbsolutePath(); Log.d("StoragePath", "路径:" + storageRootPath); // 这里就会输出/storage/emulated/0 }
三、额外注意事项
- 如果你不需要公共存储的根目录,而是应用私有外部存储(比如存应用专属文件,不需要用户权限,Android 4.4+支持),可以用:
String privateExternalPath = getExternalFilesDir(null).getAbsolutePath(); // 路径类似/storage/emulated/0/Android/data/你的包名/files - 在Android Q(API 29)及以上,
Environment.getExternalStorageDirectory()被标记为过时,推荐使用MediaStore或Scoped Storage API,但针对你的6.0版本,完全可以放心使用。
内容的提问来源于stack exchange,提问作者Golok Mallick




