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();
        }
    }

}

三,测试效果:

相册

 

posted @ 2025-05-01 09:29  刘宏缔的架构森林  阅读(206)  评论(0)    收藏  举报