由于Android Q中已弃用getExternalStoragePublicDirectory,因此建议使用其他方式。那么我们如何指定我们要将相机应用程序生成的照片存储到DCIM文件夹中,还是将其存储在DCIM中的自定义子文件夹中?

文档指出,接下来的3个选项是新的首选替代品:

  • Context#getExternalFilesDir(String)
  • MediaStore
  • Intent#ACTION_OPEN_DOCUMENT

  • 选项1不存在,因为这意味着如果卸载该应用程序,照片将被删除。

    选项3也不是一个选择,因为它将要求用户通过SAF文件浏览器选择位置。

    我们只剩下选项2,即MediaStore;但是没有文档说明如何使用它代替Android Q中的getExternalStoragePublicDirectory。

    最佳答案

    根据文档,将DCIM/...用作the RELATIVE_PATH ,其中...就是您的自定义子目录。因此,您将得到如下所示的结果:

          val resolver = context.contentResolver
          val contentValues = ContentValues().apply {
            put(MediaStore.MediaColumns.DISPLAY_NAME, "CuteKitten001")
            put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
            put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/PerracoLabs")
          }
    
          val uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
    
          resolver.openOutputStream(uri).use {
            // TODO something with the stream
          }
    

    请注意,由于RELATIVE_PATH是API级别29的新增功能,因此您需要在较新的设备上使用此方法,而在较旧的设备上使用getExternalStoragePublicDirectory()

    10-07 20:10