android - 替换 getExternalStoragePublicDirectory() API 21-30
问题描述
我的应用minSdkVersion
是 21 和targetSdkVersion
30。我需要将图像保存到外部存储(到图片文件夹)
所以,这里的saveImage
功能:
fun saveImage(context: Context) {
val fileName = "${System.currentTimeMillis()}.png"
val fileType = "image/png"
val folder = "MyApp"
val imageQuality = 100
val write: (OutputStream) -> Boolean = { outputStream ->
this.compress(Bitmap.CompressFormat.PNG, imageQuality, outputStream)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, fileName)
put(MediaStore.MediaColumns.MIME_TYPE, fileType)
put(MediaStore.MediaColumns.RELATIVE_PATH, "${Environment.DIRECTORY_PICTURES}/$folder")
}
context.contentResolver.let {
it.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)?.let { uri ->
it.openOutputStream(uri)?.let(write)
}
}
} else {
val imagesDir = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
.toString() + File.separator + folder
val file = File(imagesDir)
if (!file.exists()) {
file.mkdir()
}
val image = File(imagesDir, fileName)
write(FileOutputStream(image))
}
}
我在清单文件中也有这个权限:
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
这工作正常,但getExternalStoragePublicDirectory
在 API 29+ 中已弃用。有没有办法摆脱这个不推荐使用的功能?现在我只是压制警告,但感觉有点糟糕。
解决方案
推荐阅读
- c# - 写流的两种方法?
- r - 在R中逐个字符匹配字符串
- ms-access - 访问 - 如何添加 2 列并减去 1
- php - php -- 获取需要登录的页面内容并阻止其自动重定向?
- r - Azure 机器学习工作室中对距离包的支持
- python - Python 中的 Google Cloud Storage 客户端是否会自动检查 CRC(或 MD5)?
- typescript - 在 Jest 单元测试中使用 async/await 会在 PhpStorm(或任何 JetBrains IDE)中引发错误
- python - 检查列表中是否存在任何项目(python)
- java - 我在java中看不到例如“char”的默认值
- c# - 为什么控制台应用程序中没有捕获默认的 SynchronizationContext?