android: 保存imageview中的图片到相册
一,配置权限
在AndroidManifest.xml中添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
说明:
当目标系统在Android 13及以上,
WRITE_EXTERNAL_STORAGE被弃用且不被授权,
这时如果需要使用共享存储,则需要使用MediaStore,并请求权限
否则会报错如下:
java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=27934, uid=10091
requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
二,代码
package com.example.okdemo1.activity;
import android.Manifest;
import android.app.ActivityOptions;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.provider.MediaStore;
import android.transition.Transition;
import android.transition.TransitionInflater;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
import com.example.okdemo1.MainActivity;
import com.example.okdemo1.R;
public class ImageActivity extends AppCompatActivity {
private static final int STORAGE_PERMISSION_CODE = 101;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
// 设置activity的窗口属性为contentFeature,即可使用切换动画
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
Transition explode = TransitionInflater.from(this).inflateTransition(R.transition.slide_right);
// 此处获取了系统内置的explode动画效果设置给了activity的窗口对象
getWindow().setEnterTransition(explode);
setContentView(R.layout.activity_image);
//String imageUrl = "https://wx2.sinaimg.cn/mw690/0034c2ttly1i0s6zuaqrkj635s2n4npe02.jpg";
String imageUrl = "https://wx4.sinaimg.cn/mw690/0034c2ttly1i0s6zu16kuj62bc3cge8102.jpg";
ImageView imageView = findViewById(R.id.userImage);
Glide.with(this)
.load(imageUrl)
.diskCacheStrategy(DiskCacheStrategy.ALL) // 缓存原始图片和转换后的图片到磁盘
.skipMemoryCache(false) // 不跳过内存缓存
.into(imageView);
//请求授权
requestStoragePermission();
//处理按钮点击,保存到相册
//给按钮增加点击事件
Button myButton = findViewById(R.id.savebutton);
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 处理点击事件,保存到相册
saveImageToGallery(imageView);
System.out.println("点击完成");
}
});
}
//请求权限
private void requestStoragePermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
}
}
//保存imageview的图片到相册
private void saveImageToGallery(ImageView imageView) {
Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
String savedImageURL = MediaStore.Images.Media.insertImage(
getContentResolver(),
bitmap,
"Image_" + System.currentTimeMillis(),
"Image saved from the app"
);
if (savedImageURL != null) {
Toast.makeText(this, "Image saved to gallery!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Failed to save image!", Toast.LENGTH_SHORT).show();
}
}
}
三,测试效果:

相册

浙公网安备 33010602011771号