You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何获取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

火山引擎 最新活动