二维码的扫描与生成——个人学习记录

前言

本文基于gitHub开源项目android-zxingLibrary编写,地址为https://github.com/yipianfengye/android-zxingLibrary
该项目是对zxing的二次封装,简化了使用过程,适合初学。
但是二次封装也带来了一些BUG和性能损失,所以在有空的时候还是要学习一下zxing的使用。

一、使用环境搭建

1、在module的build.gradle文件中找到dependencies
2、为其添加一行内容implementation ‘cn.yipianfengye.android:zxing-library:2.2’
3、同步一下

二、demo界面的搭建

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".QRCode.QRCodeActivity">

    <Button
        android:id="@+id/scanQRCode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="扫描二维码"/>

    <Button
        android:id="@+id/scanPicQRCode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="扫描已有图片中的二维码"/>

    <Button
        android:id="@+id/createQRCodePic"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="生成二维码"/>

    <TextView
        android:id="@+id/txtInfo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

由于我也是初学,所以只做了调用摄像头扫二维码、扫描已有图片中的二维码和生成二维码图片这3个。

三、添加权限声明和activity声明

1、在AndroidManifest.xml文件中声明权限

<!--二维码所用权限-->
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />

2、同样在这个文件中声明activity

<activity android:name="com.uuzuche.lib_zxing.activity.CaptureActivity"/>

代码中呈现的是我们引用的开源代码中封装好的用于扫描二维码的activity,并未包含我自己建立的和上面的界面xml配合使用的activity,如果你的androidStudio并未帮你声明你的activity,你需要自己手动声明一下。

四、开工,写代码

public class QRCodeActivity extends AppCompatActivity {

    Context mContext;
    Intent intent;
    final static int REQUEST_CODE = 100;
    final static int REQUEST_IMAGE = 101;

    @BindView(R.id.scanQRCode)
    Button mScanQRCode;
    @BindView(R.id.txtInfo)
    TextView mTxtInfo;
    @BindView(R.id.scanPicQRCode)
    Button mScanPicQRCode;
    @BindView(R.id.createQRCodePic)
    Button mCreateQRCodePic;
    @BindView(R.id.img)
    ImageView mImg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_qrcode);
        ButterKnife.bind(this);
        init();
    }

    private void init() {
        mContext = getApplicationContext();
        ZXingLibrary.initDisplayOpinion(mContext);
    }

    @OnClick({R.id.scanQRCode, R.id.scanPicQRCode, R.id.createQRCodePic})
    public void onClick(View v) {
        switch (v.getId()) {
            default:
                break;
            case R.id.scanQRCode:
                intent = new Intent(mContext, CaptureActivity.class);
                startActivityForResult(intent, REQUEST_CODE);
                break;
            case R.id.scanPicQRCode:
                intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                intent.setType("image/*");
                startActivityForResult(intent, REQUEST_IMAGE);
                break;
            case R.id.createQRCodePic:
                createQRCodePic();
                break;
        }
    }

    private void createQRCodePic() {
        String textContent = "我有一只小毛驴,我从来也不骑";
        Bitmap bitmap = CodeUtils.createImage(textContent, 400, 400, null);
        mImg.setImageBitmap(bitmap);
        BitmapSaver.saveImageToGallery(bitmap, "QRCode");
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //处理二维码扫描结果
        if (requestCode == REQUEST_CODE) {
            //处理扫描结果(在界面上显示)
            if (null != data) {
                Bundle bundle = data.getExtras();
                if (bundle == null) {
                    return;
                }
                if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
                    String result = bundle.getString(CodeUtils.RESULT_STRING);
                    mTxtInfo.setText("解析结果:" + result);
                } else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
                    mTxtInfo.setText("解析二维码失败");
                }
            }
        }
        //处理图片扫描结果
        else if (requestCode == REQUEST_IMAGE) {
            if (data != null) {
                Uri uri = data.getData();
                ContentResolver cr = getContentResolver();
                try {
                    Bitmap mBitmap = MediaStore.Images.Media.getBitmap(cr, uri);//显得到bitmap图片

                    CodeUtils.analyzeBitmap(uri.getPath(), new CodeUtils.AnalyzeCallback() {
                        @Override
                        public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
                            mTxtInfo.setText("解析结果:" + result);
                        }

                        @Override
                        public void onAnalyzeFailed() {
                            mTxtInfo.setText("解析二维码失败");
                        }
                    });

                    if (mBitmap != null) {
                        mBitmap.recycle();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

上面的代码中用到了保存图片到本地的功能,这个工具类的代码如下:

public class BitmapSaver {

        /**
         * 保存图片到图库
         * @param bmp Bitmap对象的图片
         * @param bitName 图片的文件名
         */
        public static void saveImageToGallery(Bitmap bmp,String bitName ) {
                // 首先保存图片
                File appDir = new File(Environment.getExternalStorageDirectory(),
                        "111Bitmap");
                if (!appDir.exists()) {
                        appDir.mkdir();
                }

                String fileName = bitName + ".jpg";
                File file = new File(appDir, fileName);

                try {
                        FileOutputStream fos = new FileOutputStream(file);
                        bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
                        fos.flush();
                        fos.close();
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
}

我在使用这个工具类的时候将图片一律保存到了111Bitmap文件夹下。

五、备注

扫描已有图片二维码功能对图片清晰度的要求非常高(个人推测是二次封装带来的问题),建议先使用“生成二维码”功能,然后扫描这个生成的二维码。

六、运行效果

null
/**
* 皮这一下就很开心
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值