1, 将图片转换成bitmap
val bmp = BitmapFactory.decodeResource(Resources.getSystem(), R.drawable.test_src)
2, 保存图片
首先要添加对外部存储的操作权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- 保存到外部存储
- 保存图片到相册
附:代码样例
// 保存图片到应用专用外部存储目录
private fun saveImageToExternalStorage(context: Context, bitmap: Bitmap, fileName: String) {
val imageFile = File(getExternalStorageDir(context), fileName)
try {
FileOutputStream(imageFile).use { outputStream ->
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
outputStream.flush()
outputStream.close()
}
// 更新图库,以便在文件管理器中可见
context.sendBroadcast(android.content.Intent(android.content.Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
android.net.Uri.fromFile(imageFile)))
} catch (e: IOException) {
e.printStackTrace()
}
}
// 获取应用专用外部存储目录
private fun getExternalStorageDir(context: Context): File? {
return if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) {
context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
} else {
null
}
}
private fun saveBitmapToGallery(context: Context, bitmap: Bitmap, displayName: String) {
val resolver: ContentResolver = context.contentResolver
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, displayName)
put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES)
}
var imageUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
} else {
val imagesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
val image = File(imagesDir, displayName)
contentValues.put(MediaStore.MediaColumns.DATA, image.absolutePath)
resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
}
try {
imageUri?.let { uri ->
resolver.openOutputStream(uri)?.use { outputStream ->
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
}
// 刷新媒体库,以便在文件管理器中可见
MediaScannerConnection.scanFile(context, arrayOf(uri.path), null, null)
}
} catch (e: Exception) {
e.printStackTrace()
}
}