You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中SD卡内容访问空指针问题求助及代码示例需求

Android SD卡内容读取空指针问题解决

问题核心原因

你遇到的空指针及文件列表获取失败,主要源于三点:

  • 硬编码SD卡路径/mnt/sdcard0不通用,不同厂商设备的SD卡路径存在差异
  • Android 6.0+未动态申请存储读取权限,导致目录访问受限
  • 目录不存在/无权限时,listFiles()直接返回null,未做判断就使用会触发空指针

修复后的完整代码示例

1. 配置清单权限(AndroidManifest.xml)

先在清单文件中声明必要权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- Android 10+ 访问媒体文件可添加以下权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

2. 动态申请存储权限(Activity内)

Android 6.0及以上必须动态申请权限,否则无法读取外部存储:

private static final int REQUEST_STORAGE_PERM = 100;

// 检查并申请权限
private void checkStoragePermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                REQUEST_STORAGE_PERM);
    } else {
        // 权限已通过,读取SD卡内容
        loadSdCardContent();
    }
}

// 权限申请回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_STORAGE_PERM) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            loadSdCardContent();
        } else {
            Toast.makeText(this, "需授予存储权限才能读取SD卡", Toast.LENGTH_SHORT).show();
        }
    }
}

3. 安全读取SD卡内容

使用系统API获取SD卡路径,同时增加空判断避免空指针:

private void loadSdCardContent() {
    // 获取系统识别的可移动存储目录(SD卡)
    File[] externalVolumes = ContextCompat.getExternalFilesDirs(this, null);
    if (externalVolumes.length > 1 && externalVolumes[1] != null) {
        // 截取SD卡根路径(去掉Android/data/包名部分)
        String sdRootPath = externalVolumes[1].getAbsolutePath().split("/Android")[0];
        File sdCardDir = new File(sdRootPath);

        // 先判断目录是否存在、可读取
        if (sdCardDir.exists() && sdCardDir.isDirectory() && sdCardDir.canRead()) {
            File[] files = sdCardDir.listFiles();
            if (files != null) {
                // 遍历文件/目录,实例化你的sdFiles对象
                for (File file : files) {
                    sdFiles getFiles = new sdFiles();
                    // 给对象赋值(示例)
                    getFiles.setFileName(file.getName());
                    getFiles.setFilePath(file.getAbsolutePath());
                    Log.d("SD_CARD", "读取到:" + file.getName());
                }
            } else {
                Log.d("SD_CARD", "SD卡目录为空或无法读取内容");
            }
        } else {
            Log.d("SD_CARD", "SD卡不存在或无读取权限");
        }
    } else {
        Log.d("SD_CARD", "未检测到可移动SD卡");
    }
}

4. 关键注意事项

  • Android 10+采用分区存储,直接访问SD卡根目录可能受限,如需访问媒体文件,建议使用MediaStore API
  • 禁止硬编码SD卡路径,不同设备路径可能为/storage/XXXX-XXXX这类格式
  • 调用listFiles()前必须判断目录状态,避免返回null触发空指针

内容的提问来源于stack exchange,提问作者windows 11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 00:07:20