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(); } } }
关键注意事项
- 权限处理:在Android 6.0 (API 23) 及以上,必须动态申请
WRITE_EXTERNAL_STORAGE权限;在Manifest中也要声明该权限。 - 目录创建:一定要先判断目录是否存在,调用
mkdirs()确保目录层级被正确创建,否则会抛出文件未找到的异常。 - 兼容性:这个方案和你原来的
getExternalStoragePublicDirectory()逻辑完全等价,保存的视频会出现在系统相册的DCIM/MyFolder目录下,完全符合你的需求。
这样修改后,Android Studio就不会再弹出getExternalStoragePublicDirectory()的弃用警告啦!
内容的提问来源于stack exchange,提问作者user7581159
相关产品推荐
相关产品推荐

