Android_生成二维码并分享

本文介绍了在Android中如何使用Zxing库生成二维码,并将其显示在ImageView上。同时,讲解了如何保存二维码为图片,包括所需的权限添加。此外,还讨论了如何分享二维码,通过获取保存的二维码图片调用系统分享功能。在实现过程中遇到二维码保存为黑图的bug,通过修改创建二维码的代码细节成功解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生成二维码:

使用google官方的Zxing库,调用createQRCode方法,返回一个bitmap对象

 //size给固定的值,避免使用iamgeview.getWidth,导致二维码模糊
  Bitmap bitmap = EncodingHandler.createQRCode("some scan code", width);

把这个bitmap对象显示在ImageView上

 mImageView.setImageBitmap(bitmap);

这样就生成了一个二维码

这里写图片描述

那么要分享二维码,这个二维码肯定是张图片,如何把这个bitmap对象保存起来呢,封装一个saveImageToGallery方法

 /**
 * 将二维码图片保存到文件夹
 *
 * @param context
 * @param bmp
 */
public static void saveImageToGallery(Context context, Bitmap bmp) {
    // 首先保存图片
    String externalStorageState = Environment.getExternalStorageState();
    //判断sd卡是否挂载
    if (externalStorageState.equals(Environment.MEDIA_MOUNTED)) {
        /*外部存储可用,则保存到外部存储*/
        //创建一个文件夹
        File appDir = new File(Environment.getExternalStorageDirectory(), "syy");
        //如果文件夹不存在
        if (!appDir.exists()) {
        //则创建这个文件夹
            appDir.mkdir();
        }
        //将bitmap保存
        save(context, bmp, appDir);
    } else {
        //外部不可用,将图片保存到内部存储中,获取内部存储文件目录
        File filesDir = context.getFilesDir();
        //保存
        save(context, bmp, filesDir);
    }
}

save方法

private static void save(Context context, Bitmap bmp, File appDir) {
    //命名文件名称
    String fileName = System.currentTimeMillis() + ".jpg";
    //创建图片文件,传入文件夹和文件名
    File imagePath = new File(appDir, fileName);
    try {
    //创建文件输出流,传入图片文件,用于输入bitmap
        FileOutputStream fos = new FileOutputStream(imagePath);
    //将bitmap压缩成png,并保存到相应的文件夹中
        bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
    //冲刷流
        fos.flush();
    //关闭流
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    // 其次把文件插入到系统图库
    try {
        MediaStore.Images.Media.insertImage(context.getContentResolver(),
                imagePath.getAbsolutePath(), fileName, null);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    // 最后通知图库更新
    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + imagePath.getAbsolutePath())));
}

当然,不要忘记加权限
//写外部存储

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

//读外部存储
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
//写内部存储
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE"/>
//读内部存储
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE"/>

这个时候二维码就已经保存到我们的文件夹下了

分享二维码

分享二维码,首先得把之前生成并报存的二维码获取出来,获取出来以后,调用系统分享进行分享

    //获取外部存储
 File externalStorageDirectory = Environment.getExternalStorageDirectory();
    //判断sd卡是否挂载
    if (externalStorageDirectory.equals(Environment.MEDIA_MOUNTED)) {
    //如果有sd卡,则获取存放图片的文件夹路径
        String imageDirPath = Environment.getExternalStorageDirectory().toString() + File.separator
                + "syy";
        Log.d(TAG, imageDirPath);
        //
        File imgFile = new File(imageDirPath);
    //获取并分享二维码
        getQrAndShare(imgFile);
    } else {
    //如果没有sd卡,则获取内部存储路径
        File filesDir = mContext.getFilesDir();
        File imgFile = new File(filesDir.getAbsolutePath());
        getQrAndShare(imgFile);
    }

getQrAndShare方法

 private void getQrAndShare(File imgFile) {
    //获取到文件夹中所有的文件
    File[] files = imgFile.listFiles();
    //如果文件夹下没有文件,则提示去生成
    if (files.length == 0) {
        Toast.makeText(mContext, "请先在侧边栏二维码处生成二维码", Toast.LENGTH_SHORT).show();
    } else {
    //创建一个存放图片路径的集合
        List<String> imagePathList = new ArrayList<>();
        // 将所有的文件存入ArrayList中
        for (int i = 0; i < files.length; i++) {
            File file = files[i];
            imagePathList.add(file.getPath());
        }
        //获取图片路径,获取的永远是最后一张二维码
        int size = imagePathList.size();
        Log.d(TAG, "size:" + size);
        if (size != 0) {
    //获取最后一张图片的路径
            mPath = imagePathList.get(size - 1);
            Log.d(TAG, "path:" + mPath);
    //转化为uri
            Uri imageUri = Uri.fromFile(new File(mPath));
            Log.d("share", "uri:" + imageUri);
    //创建Intent设置Action为ACTION_SEND,传入uri,设置type为image/*,开启Intent
            Intent shareIntent = new Intent();
            shareIntent.setAction(Intent.ACTION_SEND);
            shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
            shareIntent.setType("image/*");
            startActivity(Intent.createChooser(shareIntent, "分享到"));
        } else {
            //由文件得到uri
            Toast.makeText(mContext, "请先在侧边栏二维码处生成二维码", Toast.LENGTH_SHORT).show();
        }
    }

}

这样会弹出系统的分享界面,然后进行分享就ok了

补充:

在生成二维码的时候,出现了一个bug,生成出来的二维码显示在Imageview上是正常的,但是保存到文件夹下就成了黑乎乎的一张黑图,经过搜索和询问,找到了解决方案,这是createQRCode的实现细节

public static Bitmap createQRCode(String str,int widthAndHeight) throws WriterException {
        Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();  
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); 
        BitMatrix matrix = new MultiFormatWriter().encode(str,
                BarcodeFormat.QR_CODE, widthAndHeight, widthAndHeight);
        int width = matrix.getWidth();
        int height = matrix.getHeight();
        int[] pixels = new int[width * height];
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                if (matrix.get(x, y)) {
                    pixels[y * width + x] = BLACK;
                }
            }
        }
        Bitmap bitmap = Bitmap.createBitmap(width, height,
                Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        return bitmap;
    }

注意到里面有一个pixels[y * width + x] = BLACK;这就导致二维码以外的区域是黑色去填充,但是二维码也是黑色的,所以整张图就成了黑色

所以把在以上代码中加上pixels[y * width + x] = WHITE;就ok了

这里写图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值