描述
saveImageToGallery
方法将 Android 应用中的视图(View
)保存为图片文件,并将其存储在设备的图库中。该方法通过将视图绘制到 Bitmap
上,生成图像,然后将其插入到 Android 系统的 MediaStore
中,以便能在图库中显示。(不需要申请动态权限,目前经测试适用android10~16, Android 10(API 29)及以上版本中,新增MediaStore对Scoped Storage的支持 )
方法
/**
* 无感保存图片
* @param context 应用的上下文
* @param view 要保存为图片的视图(ImageView/TextView/LinearLayout/.....)
* @param imageName 保存图图的名称
*/
public void saveImageToGallery(Context context, View view, String imageName) {
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DISPLAY_NAME, "" + imageName); // 文件保存的名称
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); // 保存文件的类型
values.put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/MyApp/"); // Pictures/自定义路径 自定义路径可不要
Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
try (OutputStream outStream = context.getContentResolver().openOutputStream(uri)) {
if (outStream != null) {
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); // Compress and save
}
} catch (IOException e) {
e.printStackTrace();
}
}
使用方式:
saveImageToGallery(context,yourView,"截图")
saveVideoToGallery
方法将 Android 应用中的视频保存到图库
/**
* 将视频文件保存到 Android 系统的图库中
* @param context 应用的上下文
* @param videoUri 是视频源文件的 URI,系统通过该 URI 读取视频数据
* @param videoName 保存视频的名称
*/
public void saveVideoToGallery(Context context, Uri videoUri, String videoName) {
// 创建ContentValues对象,用于设置视频文件的相关信息
ContentValues values = new ContentValues();
values.put(MediaStore.Video.Media.DISPLAY_NAME, videoName + ".mp4"); // 设置视频的文件名
values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4"); // 设置视频的MIME类型
values.put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/MyApp/"); // 保存到指定文件夹
// 插入到系统的MediaStore中,获取返回的URI
Uri uri = context.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
try (InputStream inputStream = context.getContentResolver().openInputStream(videoUri);
OutputStream outStream = context.getContentResolver().openOutputStream(uri)) {
if (inputStream != null && outStream != null) {
// 将视频流复制到系统媒体库
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
outStream.write(buffer, 0, length);
}
outStream.flush(); // 确保所有数据都写入输出流
}
} catch (IOException e) {
e.printStackTrace();
}
}
使用方式:
Uri videoUri = Uri.parse("file:///path/to/your/video.mp4"); // 传入你的视频文件路径
saveVideoToGallery(context, videoUri, "MyVideoName"); // 保存视频到图库,文件名为"MyVideoName.mp4"
`android 6~9 仍需申请保存权限才可以保存
/**
* Android 6.0 及以上和 10以下版本,需要动态请求权限,但需要确认在运行时的权限检查
* @param context 应用的上下文
* @param view 要保存为图片的视图(ImageView/TextView/LinearLayout/.....)
* @param imageName 保存图图的名称
*/
private void saveImageToExternalStorage(Context context, View view, String imageName) {
// 权限管理:检查是否已经授予权限
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
return; // 如果权限未授予,直接返回
}
// 创建一个与 View 大小相同的 Bitmap
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas); // 将视图绘制到 Bitmap 上
// 获取 Pictures 目录(针对 Android 10 以下)
File directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
if (!directory.exists()) {
directory.mkdirs(); // 如果文件夹不存在,创建文件夹
}
// 创建文件
File file = new File(directory, imageName + ".jpg");
Log.d("Gallery", "file dir: " + file.getAbsolutePath());
// 保存 Bitmap 到文件
try (FileOutputStream fos = new FileOutputStream(file)) {
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); // 压缩并保存图片
fos.flush();
// 扫描文件,通知系统图库更新
MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null, (path, uri) -> {
Log.d("Gallery", "File scanned: " + path);
});
} catch (IOException e) {
e.printStackTrace();
}
}
使用方式:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
// 在 Android 10 以下,未申请则先申请
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
}else {
// 已申请得到权限进行保存
saveImageToExternalStorage(this, main, formattedDate);
}
} else {
// Android 10 及以上处理(不在此示例中)
saveImageToGallery(this,main,formattedDate);
}