如何在点击按钮时使用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中添加权限:
Android 10+无需WRITE权限,但如果你的minSdkVersion是29,建议在<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/><application>标签内添加android:requestLegacyExternalStorage="true"做兼容。 - 确保Glide使用最新稳定版本,避免兼容性问题。
内容的提问来源于stack exchange,提问作者mukeshsoni
相关产品推荐
相关产品推荐

