You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在点击按钮时使用Glide将图片保存到存储中?

实现Glide加载图片到RecyclerView+点击预览+保存功能

我来帮你一步步搞定这个需求,结合你给出的Glide加载代码,我们分三个核心部分来实现:


1. 完善RecyclerView中Glide的加载与点击事件

首先在你的RecyclerView Adapter的onBindViewHolder方法里,除了现有加载逻辑,还要给ImageView添加点击事件,跳转到大图预览页面。这里可以优化下Glide的配置,加上错误占位图,让体验更流畅:

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Photos image = images.get(position);
    // 优化后的Glide加载逻辑
    Glide.with(getActivity())
         .load(image.getUrl())
         .thumbnail(Glide.with(getActivity()).load(R.drawable.loader))
         .fitCenter()
         .crossFade()
         .error(R.drawable.error_placeholder) // 添加错误占位图,加载失败时显示
         .into(holder.imageViewPreview);

    // 给图片添加点击事件,跳转到大图预览页面
    holder.imageViewPreview.setOnClickListener(v -> {
        Intent intent = new Intent(getActivity(), ImagePreviewActivity.class);
        intent.putExtra("IMAGE_URL", image.getUrl());
        startActivity(intent);
    });
}

// 定义ViewHolder(如果还没实现的话)
static class ViewHolder extends RecyclerView.ViewHolder {
    ImageView imageViewPreview;

    ViewHolder(View itemView) {
        super(itemView);
        imageViewPreview = itemView.findViewById(R.id.image_preview);
    }
}

2. 创建大图预览Activity

新建一个ImagePreviewActivity,布局里包含全屏ImageView和底部的保存按钮:

布局文件(activity_image_preview.xml)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000">

    <ImageView
        android:id="@+id/iv_full_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitCenter"/>

    <Button
        android:id="@+id/btn_save_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="20dp"
        android:text="保存图片"
        android:background="#DD000000"
        android:textColor="#FFF"/>
</RelativeLayout>

Activity核心逻辑

在这个页面里用Glide加载高清图,同时实现保存图片的功能:

public class ImagePreviewActivity extends AppCompatActivity {
    private ImageView ivFullImage;
    private Button btnSaveImage;
    private String imageUrl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_preview);

        ivFullImage = findViewById(R.id.iv_full_image);
        btnSaveImage = findViewById(R.id.btn_save_image);

        // 获取从RecyclerView传递过来的图片URL
        imageUrl = getIntent().getStringExtra("IMAGE_URL");

        // 加载高清大图
        Glide.with(this)
             .load(imageUrl)
             .fitCenter()
             .into(ivFullImage);

        // 绑定保存按钮点击事件
        btnSaveImage.setOnClickListener(v -> saveImageToGallery());
    }

    // 核心:保存图片到相册的方法
    private void saveImageToGallery() {
        // 先处理Android 6.0+的动态权限申请
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
            return;
        }

        // 通过Glide获取图片Bitmap并保存
        Glide.with(this)
             .asBitmap()
             .load(imageUrl)
             .into(new CustomTarget<Bitmap>() {
                 @Override
                 public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                     boolean isSaved = saveBitmapToGallery(ImagePreviewActivity.this, resource);
                     Toast.makeText(ImagePreviewActivity.this,
                             isSaved ? "图片保存成功" : "图片保存失败", Toast.LENGTH_SHORT).show();
                 }

                 @Override
                 public void onLoadCleared(@Nullable Drawable placeholder) {}
             });
    }

    // 工具方法:将Bitmap保存到系统相册
    private boolean saveBitmapToGallery(Context context, Bitmap bitmap) {
        // 适配Android 10+的MediaStore存储方式
        ContentValues values = new ContentValues();
        String fileName = "glide_image_" + System.currentTimeMillis() + ".jpg";
        values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/GlideImages");
        } else {
            String savePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/GlideImages/";
            File dir = new File(savePath);
            if (!dir.exists()) dir.mkdirs();
            values.put(MediaStore.Images.Media.DATA, savePath + fileName);
        }

        ContentResolver resolver = context.getContentResolver();
        Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        if (uri == null) return false;

        try (OutputStream outputStream = resolver.openOutputStream(uri)) {
            return bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);
        } catch (IOException e) {
            e.printStackTrace();
            resolver.delete(uri, null, null);
            return false;
        }
    }

    // 处理权限申请结果
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                saveImageToGallery();
            } else {
                Toast.makeText(this, "需要存储权限才能保存图片", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

3. 必要配置说明

  • 在AndroidManifest.xml中添加权限:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
    
    Android 10+无需WRITE权限,但如果你的minSdkVersion是29,建议在<application>标签内添加android:requestLegacyExternalStorage="true"做兼容。
  • 确保Glide使用最新稳定版本,避免兼容性问题。

内容的提问来源于stack exchange,提问作者mukeshsoni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:00:03