【Android】长按保存图片到本地

📖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;
                    }
                });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小满@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值