因为Android Q
中已经弃用了getExternalStoragePublicDirectory,所以建议使用其他方法。那么,我们如何指定要将相机应用程序中生成的照片存储到DCIM
文件夹或DCIM
中的自定义子文件夹中
文档指出,以下3个选项是新的首选替代方案:
选项1是不可能的,因为这意味着如果应用程序被卸载,照片将被删除。
选项3也不是一个选择,因为它需要用户通过SAF文件资源管理器选择位置。
我们只剩下第二种选择,MediaStore;但在这个问题的时候,还没有关于如何在Android Q中使用它来替代getExternalStoragePublicDirectory的文档。
发布于 2019-06-06 06:13:26
根据文档,对the RELATIVE_PATH
使用DCIM/...
,其中...
是您的定制子目录。所以,你最终会得到这样的结果:
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 Level 29的新成员,因此您需要在较新的设备上使用此方法,而在较旧的设备上使用getExternalStoragePublicDirectory()
。
发布于 2019-08-26 04:58:30
@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);
根据@SamChen的建议,文本文件的代码应如下所示:
Uri uri = resolver.insert(MediaStore.Files.getContentUri("external"), contentValues);
因为我们不想让txt文件停留在Images文件夹中。
所以,我有mimeType
的地方,你输入你想要的mime类型。例如,如果你想要txt
(@Panache),你应该用这个字符串替换mimeType
:"text/plain"
。下面是mime类型的列表:https://www.freeformatter.com/mime-types-list.html
另外,在我有变量name
的地方,您可以将它替换为本例中的文件名。
发布于 2021-01-25 22:56:31
由于安全问题,默认情况下,针对安卓Q- API 29+的应用程序会禁用存储访问。如果要使其能够在AndroidManifest.xml中添加以下属性:
<manifest ... >
<!-- This attribute is "false" by default for Android Q or higher -->
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
</manifest>
那么你必须使用getExternalStorageDirectory()
而不是getExternalStoragePublicDirectory()
。
例如:如果你想在内部存储中创建一个目录,如果不存在。
File mediaStorageDir = new File(Environment.getExternalStorageDirectory() + "/SampleFolder");
// Create the storage directory if it does not exist
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Log.d("error", "failed to create directory");
}
}
https://stackoverflow.com/questions/56468539
复制相似问题