保存图片到手机存储

180 阅读1分钟

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" />
  1. 保存到外部存储

Image_20231211164805.png

  1. 保存图片到相册

Image_20231211164857.png

附:代码样例

// 保存图片到应用专用外部存储目录  
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()  
    }  
}