Android zxing(上)

4,474 阅读1分钟

二维码一般在项目都会用到,今天分享下我开发二维码的一些心得。

zxing介绍

github地址:github.com/zxing/zxing

代码很多,官方演示的例子在文件android,一个较为完整的app,导入Android studio,发现少了CameraConfigurationUtils,这个类在文件android-core下。官方效果图:
但是实际开发只需要扫码和生成二维码两个功能就夠了,因此我做了抽离删减,最终我的效果图:

zxing使用

添加依赖

compile 'com.google.zxing:core:3.2.1'

扫描二维码

 case R.id.qrcode_dencode: //扫描
 intent = new Intent(MainActivity.this, CaptureActivity.class);
 startActivityForResult(intent, REQUEST_CODE);
 break;
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) { //RESULT_OK = -1
            Bundle bundle = data.getExtras();
            String scanResult = bundle.getString("result");
            Toast.makeText(MainActivity.this, scanResult, Toast.LENGTH_LONG).show();
        }
    }

生成二维码

 case R.id.qrcode_encode: //生成
 try {
        Bitmap mBitmap = QRCodeEncoder.encodeAsBitmap("http://wuxiaolong.me/", 300);
        qrcodeImg.setImageBitmap(mBitmap);

      } catch (Exception e) {
        e.printStackTrace();
      }
     break;

识别二维码

 //长按图片识别二维码
        qrcodeImg.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                qrcodeImg.setDrawingCacheEnabled(true);
                Bitmap bitmap = Bitmap.createBitmap(qrcodeImg.getDrawingCache());
                qrcodeImg.setDrawingCacheEnabled(false);
                decodeQRCode(bitmap);
                return true;
            }
        });
  /**
     * 解析二维码图片
     *
     * @param bitmap   要解析的二维码图片
     */
    public final Map HINTS = new EnumMap<>(DecodeHintType.class);

    public void decodeQRCode(final Bitmap bitmap) {
        new AsyncTask() {
            @Override
            protected String doInBackground(Void... params) {
                try {
                    int width = bitmap.getWidth();
                    int height = bitmap.getHeight();
                    int[] pixels = new int[width * height];
                    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
                    RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
                    Result result = new MultiFormatReader().decode(new BinaryBitmap(new HybridBinarizer(source)), HINTS);
                    return result.getText();
                } catch (Exception e) {
                    return null;
                }
            }

            @Override
            protected void onPostExecute(String result) {
                Log.d("wxl", "result=" + result);
                Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
            }
        }.execute();

    }

由于时间仓促,抽离的代码或多或少有些问题,细节待优化。
另外,ViewfinderView自定义属性参考了my.oschina.net/smuswc/blog…

源码

官方的例子和我自己的抽离出的代码都上传github了,地址:github.com/WuXiaolong/…

下篇带您走一遍官方演示的zxing例子,敬请期待

微信公众号:AndroidProgrammer


长按二维码识别一键关注