android 保存图片并在相册展示

478 阅读1分钟

juejin.cn/post/684490…

1 如果只是单纯的保存一个Bitmap到内存并不需要规定文件的路径 名称啥的

val bitmap =  CodeUtils.createQRCode(code,600,R.mipmap.ic_launcher)
MediaStore.Images.Media.insertImage(contentResolver,bitmap,"","")

2 保存bitmap到file

private fun saveBitmap(bitmap: Bitmap, bitmapName: String): File? {
    val file: File
    val fileName: String = if (Build.BRAND == "Xiaomi") {
        Environment.getExternalStorageDirectory().path + "/DCIM/Camera/" + bitmapName
    } else {
        Environment.getExternalStorageDirectory().path + "/DCIM/" + bitmapName
    }
    Log.d("path", fileName)
    file = File(fileName)
    if (file.exists()) {
        file.delete()
    }
    val outputStream: FileOutputStream
    try {
        outputStream = FileOutputStream(file)
        if (bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream)) {
            outputStream.flush()
            outputStream.close()
            Log.d("path", file.absolutePath)
            return file;
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
    return null
}

通知刷新,拷贝图片到Picture,所以磁盘上会有两份图片

val file =  saveBitmap(bitmap,"gy.png")
file?.apply {
    MediaStore.Images.Media.insertImage(contentResolver,
        absolutePath,
        "gy.png",
        null)
}

3 bitmap 直接保存的另一种写法

 val values = ContentValues()
                        values.put(MediaStore.MediaColumns.DISPLAY_NAME, "gy12132.png")
//                        values.put(MediaStore.MediaColumns.MIME_TYPE, getMimeType(it))
                        values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM)
                        val contentResolver = contentResolver
                        val uri =
                            contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
                                ?: return
                        try {
                            val outputStream = contentResolver.openOutputStream(uri)
                            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream)
                            outputStream?.close()
                        } catch (e: IOException) {
                            e.printStackTrace()
                        }

待确认代码

  //1 不生效 就用2
            MediaScannerConnection.scanFile(
                    getApplicationContext(),
                    new String[]{file.getAbsolutePath()},
                    new String[]{"image/jpeg"},
                    (path, uri) -> {
                        // Scan Completed
                    });
        //2 
            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
            values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
            values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, System.currentTimeMillis() + "");
            context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
            context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.getAbsolutePath())));
    
private  String getSuffix(File file) {
    if (file == null || !file.exists() || file.isDirectory()) {
        return null;
    }
    String fileName = file.getName();
    if (fileName.equals("") || fileName.endsWith(".")) {
        return null;
    }
    int index = fileName.lastIndexOf(".");
    if (index != -1) {
        return fileName.substring(index + 1).toLowerCase(Locale.US);
    } else {
        return null;
    }
}

public  String getMimeType(File file){
    String suffix = getSuffix(file);
    if (suffix == null) {
        return "file/*";
    }
    String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(suffix);
    if (type != null || !type.isEmpty()) {
        return type;
    }
    return "file/*";
}