由于Android Q
中已弃用getExternalStoragePublicDirectory,因此建议使用其他方式。那么我们如何指定我们要将相机应用程序生成的照片存储到DCIM
文件夹中,还是将其存储在DCIM
中的自定义子文件夹中?
文档指出,接下来的3个选项是新的首选替代品:
选项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()
。