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

Android中如何在不使用已弃用方法的前提下获取/storage/emulated/0/DCIM路径?

解决Android 10以下版本避免弃用方法获取公共DCIM路径的问题

Hey there! I get your frustration with that persistent deprecation warning—let's fix this while keeping your videos visible in the system gallery.

核心问题拆解

你需要在Android Q (API 29) 以下版本获取公共/storage/emulated/0/DCIM路径,同时避免使用getExternalStoragePublicDirectory(),还要保证保存的视频能被系统相册识别(所以不能用getExternalFilesDir(),因为那是应用私有存储)。

替代方案(API < 29)

对于Android 9及以下版本,我们可以用Environment.getExternalStorageDirectory()拼接DCIM目录来替代弃用的方法。这个方法在API 28及以下是完全合规的,不会触发 deprecation 警告,而且最终得到的路径和getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)完全一致,视频依然会被系统相册扫描到。

完整适配代码示例

// 处理权限(API 23+需要动态申请WRITE_EXTERNAL_STORAGE)
// 先确保权限已获取,再执行存储操作

OutputStream outputStream = null;
try {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        // Android 10及以上的MediaStore方案(你原来的代码可以保留)
        ContentResolver resolver = getContentResolver();
        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName);
        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4");
        contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM + "/MyFolder");
        Uri videoUri = resolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, contentValues);
        
        if (videoUri != null) {
            ParcelFileDescriptor descriptor = getContentResolver().openFileDescriptor(videoUri, "w");
            if (descriptor != null) {
                FileDescriptor fileDescriptor = descriptor.getFileDescriptor();
                outputStream = new FileOutputStream(fileDescriptor);
            }
        }
    } else {
        // Android 9及以下的替代方案,无弃用警告
        File dcimRootDir = new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_DCIM);
        File myFolderDir = new File(dcimRootDir, "MyFolder");
        
        // 确保目录存在,避免IO异常
        if (!myFolderDir.exists()) {
            myFolderDir.mkdirs();
        }
        
        File outputFile = new File(myFolderDir, fileName);
        outputStream = new FileOutputStream(outputFile);
    }
    
    // 这里执行写入视频数据的操作
    // ...
    
} catch (IOException e) {
    e.printStackTrace();
} finally {
    // 记得关闭流
    if (outputStream != null) {
        try {
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关键注意事项

  1. 权限处理:在Android 6.0 (API 23) 及以上,必须动态申请WRITE_EXTERNAL_STORAGE权限;在Manifest中也要声明该权限。
  2. 目录创建:一定要先判断目录是否存在,调用mkdirs()确保目录层级被正确创建,否则会抛出文件未找到的异常。
  3. 兼容性:这个方案和你原来的getExternalStoragePublicDirectory()逻辑完全等价,保存的视频会出现在系统相册的DCIM/MyFolder目录下,完全符合你的需求。

这样修改后,Android Studio就不会再弹出getExternalStoragePublicDirectory()的弃用警告啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 14:14:08