📖Android长按保存图片到本地
✅第1步:封装实现代码
一共封装有两种实现方式:
- 下载网络图片到本地(
Glide
实现) - 将imageView图片资源保存到本地
如果没有导入Glide
,则需要在build.gradle
配置文件下导入如下依赖:
implementation 'com.github.bumptech.glide:glide:4.16.0' // glide
/**
* Android工具类
*/
public class SystemUtils {
/**
* 下载网络图片到本地
* @param filePath 网络图片的URL
* @param mContext 上下文对象
*/
public static void glideDownPic(String filePath, Context mContext) {
Glide.with(mContext) // 初始化Glide请求
.asBitmap() // 指定加载Bitmap类型
.load(filePath) // 设置图片的URL
.into(new SimpleTarget<Bitmap>() { // 指定目标类型为SimpleTarget
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
// 将Bitmap保存到本地文件中
// 获取当前时间
Calendar calendar = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault());
String formattedDate = formatter.format(calendar.getTime());
//生成文件名
String fileName = "image-" + formattedDate + ".jpg";
//获取SD卡路径
File directory = Environment.getExternalStorageDirectory();
File file = new File(directory, fileName);
try {
FileOutputStream fos = new FileOutputStream(file); // 创建文件输出流
resource.compress(Bitmap.CompressFormat.JPEG, 100, fos); // 压缩并写入文件
fos.flush(); // 刷新输出流
fos.close(); // 关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
Toast.makeText(mContext, "下载成功", Toast.LENGTH_SHORT).show();
}
});
}
/**
* 将imageView图片资源保存到本地
* @param imageView 要保存图片的ImageView
* @param mContext 上下文对象
*/
public static void downImageView(ImageView imageView, Context mContext) {
// 测量ImageView的宽高,以便计算其绘制缓存
imageView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
imageView.buildDrawingCache();// 构建ImageView的绘制缓存
Bitmap mBitmap = imageView.getDrawingCache();// 从绘制缓存中获取Bitmap
// 获取当前时间
Calendar calendar = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault());
String formattedDate = formatter.format(calendar.getTime());
// 生成文件名
String fileName = "image-" + formattedDate + ".jpg";
// 获取SD卡路径
File directory = Environment.getExternalStorageDirectory();
File file = new File(directory, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);// 创建文件输出流
mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);// 将Bitmap压缩为JPEG格式并写入文件
fos.flush();// 刷新输出流
fos.close();// 关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
Toast.makeText(mContext, "下载成功", Toast.LENGTH_SHORT).show();
}
}
再封装一个弹框确认方法:DialogUtils
public class DialogUtils {
/**
* 确认弹框
* @param context
* @param title
* @param message
* @param listener
*/
public static void showConfirmationDialog(Context context, String title, String message, final ConfirmationListener listener) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(title)
.setMessage(message)
.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (listener != null) {
listener.onConfirm();
}
dialog.dismiss();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.create()
.show();
}
}
✅第2步:调用
实现代码已经封装好了,那么调用就非常简单了,
//imageView换成指定的图片视图组件即可
imageView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
DialogUtils.showConfirmationDialog(mContext, "图片下载", "是否下载图片", new DialogUtils.ConfirmationListener() {
@Override
public void onConfirm() {
//SystemUtils.downImageView(imageView, mContext);//下载图片
SystemUtils.glideDownPic(filePath,mContext);//下载图片,filePath是要下载的图片地址
}
});
return true;
}
});