一、选取图片
在进行图片保存操作之前,我们需要先从手机的相册中选取一张图片。这可以通过调用系统相册,或者使用第三方图片库来实现。
使用系统相册
使用系统相册需要我们通过隐式意图(Intent)打开相册。下面是打开相册并返回结果的代码示例:
// 打开相册
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_CODE_SELECT_IMAGE);
// 获取选中的图片Uri
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_SELECT_IMAGE && resultCode == RESULT_OK) {
Uri selectedImageUri = data.getData();
// 处理选中的图片
}
}
使用第三方图片库
如果需要更丰富的图片展示和处理功能,我们可以使用第三方图片库。例如,使用Glide加载图片:
Glide.with(this)
.load(imageUrl)
.into(imageView);
二、保存图片
将图片保存到相册需要以下几个步骤:
- 获取图片的Bitmap对象。
- 创建保存图片的文件路径。
- 保存图片到指定路径。
- 通知相册刷新。
获取图片的Bitmap对象
如果图片已经加载到了ImageView中,可以使用以下代码获取Bitmap对象:
imageView.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(imageView.getDrawingCache());
imageView.setDrawingcacheEnabled(false);
创建保存图片的文件路径
在Android Q之前,可以通过以下代码创建保存图片的文件路径:
String imagePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath() +
File.separator + "demo.jpg";
File file = new File(imagePath);
if (!file.exists()) {
boolean result = file.createNewFile();
}
Android Q 及以上版本的处理方式有所不同,需要使用MediaStore API来保存图片。下面会有详细的介绍。
保存图片到指定路径
使用以下代码将Bitmap对象保存到指定文件路径:
try {
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
通知相册刷新
在保存图片成功后,需要向系统发送广播通知相册刷新。这样才能在相册中看到保存的图片。
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.fromFile(new File(imagePath))));
三、在Android Q及以上版本中保存图片到相册
在Android Q及以上版本中,文件存储得到了重新设计,并且禁止了直接操作外部存储空间。因此,直接使用上面的代码保存图片到指定路径的方式已经行不通了。
使用MediaStore API保存图片
在Android Q及以上版本中,需要使用MediaStore API来保存图片到相册。具体流程如下:
- 创建一个ContentValues对象,并设置插入的数据信息。
- 使用ContentResolver将数据插入到MediaStore.Images.Media表中。
- 获取新增图片的Uri。 以下是保存图片到相册的完整代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DISPLAY_NAME, "demo");
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM);
ContentResolver resolver = getContentResolver();
Uri external = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Uri insertUri = resolver.insert(external, values);
try {
OutputStream stream = resolver.openOutputStream(insertUri);
boolean compressed = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
stream.flush();
stream.close();
if (compressed) {
Toast.makeText(this, "保存成功!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "保存失败!", Toast.LENGTH_SHORT).show();
}
} catch (IOException e) {
e.printStackTrace();
}
// 通知相册刷新
if (insertUri != null) {
MediaScannerConnection.scanFile(this, new String[]{insertUri.getPath()}, new String[]{"image/jpeg"}, null);
}
} else {
// Android Q以下的保存方式
// ...
}
四、总结
本文详细阐述了Android保存图片到相册的步骤,从选取图片到保存图片的完整流程进行了详细介绍,并给出了相关代码示例。尤其是在Android Q及以上版本中,由于对文件存储机制的变更,需要使用MediaStore API来保存图片到相册,这一点需要我们特别注意。