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

Android Studio生成二维码后如何通过按钮将图片保存到系统相册

实现方案

完全可以通过绑定保存按钮的点击事件完成二维码存入系统相册的操作,以下是适配不同Android版本的实现方案:

适配说明

  • Android 6.0(API 23)~ Android 9(API 28):需要申请WRITE_EXTERNAL_STORAGE存储权限才能写入公共相册
  • Android 10(API 29)及以上:采用分区存储机制,无需申请存储权限,直接通过MediaStore接口写入相册即可

代码修改点

  1. 将生成的二维码Bitmap声明为类成员变量,避免保存时拿不到图片实例
  2. 为保存按钮添加点击事件,写入图片到系统相册的逻辑
  3. 补充权限申请结果回调,确保低版本设备权限通过后再执行保存操作

完整修改后代码

import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.ContentValues;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import androidmads.library.qrgenearator.QRGContents;
import androidmads.library.qrgenearator.QRGEncoder;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

public class GenerateActivity extends AppCompatActivity {
    private Button saveBtn, createBtn;
    private ImageView qrImage;
    private EditText qrValue;
    // 声明全局二维码Bitmap变量
    private Bitmap qrBitmap;
    private static final int PERMISSION_REQUEST_CODE = 100;

    public void init() {
        qrValue = findViewById(R.id.qrValue);
        qrImage = findViewById(R.id.qrImage);
        createBtn = findViewById(R.id.createBtn);
        saveBtn = findViewById(R.id.saveBtn);
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_generate);
        init();
        // 统一申请所需权限
        requestNeededPermissions();

        createBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String data = qrValue.getText().toString().trim();
                if (data.isEmpty()) {
                    Toast.makeText(GenerateActivity.this, "请输入二维码内容", Toast.LENGTH_SHORT).show();
                    return;
                }
                QRGEncoder qrgEncoder = new QRGEncoder(data, null, QRGContents.Type.TEXT, 500);
                qrBitmap = qrgEncoder.getBitmap();
                qrImage.setImageBitmap(qrBitmap);
            }
        });

        // 保存按钮点击逻辑
        saveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (qrBitmap == null) {
                    Toast.makeText(GenerateActivity.this, "请先生成二维码", Toast.LENGTH_SHORT).show();
                    return;
                }
                // 低版本检查存储权限
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q && ContextCompat.checkSelfPermission(GenerateActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(GenerateActivity.this, "请先授予存储权限", Toast.LENGTH_SHORT).show();
                    requestNeededPermissions();
                    return;
                }
                // 执行保存操作
                saveBitmapToAlbum();
            }
        });
    }

    // 申请所需权限
    private void requestNeededPermissions() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
            List<String> permissions = new ArrayList<>();
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            }
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);
            }
            if (!permissions.isEmpty()) {
                ActivityCompat.requestPermissions(this, permissions.toArray(new String[0]), PERMISSION_REQUEST_CODE);
            }
        }
    }

    // 保存Bitmap到系统相册
    private void saveBitmapToAlbum() {
        String displayName = "QRCode_" + System.currentTimeMillis() + ".png";
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                ContentValues values = new ContentValues();
                values.put(MediaStore.Images.Media.DISPLAY_NAME, displayName);
                values.put(MediaStore.Images.Media.MIME_TYPE, "image/png");
                values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);
                values.put(MediaStore.Images.Media.IS_PENDING, 0);
                OutputStream outputStream = getContentResolver().openOutputStream(getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values));
                qrBitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
                if (outputStream != null) {
                    outputStream.close();
                }
            } else {
                MediaStore.Images.Media.insertImage(getContentResolver(), qrBitmap, displayName, "生成的二维码");
            }
            Toast.makeText(this, "二维码已保存到相册", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this, "保存失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }

    // 权限申请结果回调
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "权限申请成功", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "权限被拒绝,无法保存图片到相册", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 16:06:04