由于getExternalStoragePublicDirectory已在中弃用Android Q,建议使用其他方式。那么我们如何指定我们要将相机应用程序生成的照片存储到DCIM文件夹或文件夹中的自定义子文件夹中DCIM呢?
文档指出,接下来的3个选项是新的首选替代品:
选项1不存在,因为这意味着如果卸载该应用程序,照片将被删除。
选项3也不是一个选择,因为它将要求用户通过SAF文件浏览器选择位置。
我们只剩下选项2,即MediaStore;但是没有文档说明如何使用它代替Android Q中的getExternalStoragePublicDirectory。
Gau*_*all 34
@CommonsWare 的回答很棒。但是对于那些想要在 Java 中使用它的人,你需要试试这个:
ContentResolver resolver = context.getContentResolver();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name);
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);
Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
Run Code Online (Sandbox Code Playgroud)
根据@SamChen 的建议,文本文件的代码应如下所示:
Uri uri = resolver.insert(MediaStore.Files.getContentUri("external"), contentValues);
Run Code Online (Sandbox Code Playgroud)
因为我们不希望 txt 文件留在 Images 文件夹中。
所以,我有的地方mimeType,你输入你想要的 mime 类型。例如,如果你想要txt(@Panache) 你应该mimeType用这个字符串替换:"text/plain"。这里是一个 mime 类型列表:https : //www.freeformatter.com/mime-types-list.html
另外,在我有变量的地方name,你用你的情况下的文件名替换它。
Com*_*are 19
根据该文档,使用DCIM/...了的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
}
Run Code Online (Sandbox Code Playgroud)
请注意,由于RELATIVE_PATH是API级别29的新增功能,因此您需要在较新的设备上使用此方法,而getExternalStoragePublicDirectory()在较旧的设备上使用。
| 归档时间: |
|
| 查看次数: |
5973 次 |
| 最近记录: |