二维码扫描

二维码扫描的话,现在一般zxing用的比较多,还有一个zbar,已经停止维护了。老早的时候,用的eclipse开发,需要导入jar包,还得把zxing的很多java类拷进项目里,实在有碍观瞻啊。现在ide切换到studio了,感觉方便了很多,jar包不用手动管理了。现在我们用到二维码相关的开发的话,在项目里,可以直接在gradle中引入了。

二维码的开发呢,大致分2种需求吧,一种呢,就是简单的用到扫码生成码的功能;另一种呢,是需要深度定制的,例如扫码界面,近距离扫码精度等。对于第一种,我们希望可以快速集成,那么有没有这样一种框架呢?答案当然是有的,这里介绍2个github项目。

一、zxing-android-embedded

github链接:https://github.com/journeyapps/zxing-android-embedded
这个是基于zxing做的一个封装,具体用法如下:
1.直接调用作者的CaptureActivity
首先在gradle中添加依赖

compile 'com.google.zxing:core:3.2.1'
compile 'com.journeyapps:zxing-android-embedded:3.3.0'

具体使用

new IntentIntegrator(this).initiateScan(); // `this` 当前activity
//或者
IntentIntegrator.forFragment(this).initiateScan(); // `this` 当前fragment

// 获取扫描结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if(result != null) {
        if(result.getContents() == null) {
            Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
        }
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

一些选择项

new IntentIntegrator(this)
        .setDesiredBarcodeFormats(IntentIntegrator.ONE_D_CODE_TYPES)// 扫码的类型,可选:一维码,二维码,一/二维码
        .setPrompt("请对准二维码")// 设置提示语
        .setCameraId(0)// 选择摄像头,可使用前置或者后置
        .setBeepEnabled(false)// 是否开启声音,扫完码之后会"哔"的一声
        .setBarcodeImageEnabled(true)// 扫完码之后生成二维码的图片
        .initiateScan();// 初始化扫码

注意,以上扫码是横屏,若要改为竖屏,则在AndroidManifest.xml中配置CaptureActivity


调用时

IntentIntegrator integrator = new IntentIntegrator(this);
integrator.setOrientationLocked(false);
integrator.initiateScan();

2.自定义CaptureActivity,可定制扫描界面
参考:https://blog.csdn.net/u010618194/article/details/77891313
Activity中代码如下

public class ScanActivity extends AppCompatActivity {

    private CaptureManager capture;
    private DecoratedBarcodeView barcodeScannerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan);
        barcodeScannerView = (DecoratedBarcodeView) findViewById(R.id.dbv_custom);
        capture = new CaptureManager(this, barcodeScannerView);
        capture.initializeFromIntent(getIntent(), savedInstanceState);
        capture.decode();
    }

    @Override
    protected void onResume() {
        super.onResume();
        capture.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        capture.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        capture.onDestroy();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        capture.onSaveInstanceState(outState);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
        capture.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return barcodeScannerView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
    }

对应的activity_scan.xml




    


可以把扫码初始化代码放在Util中

public class ScanUtil {
    /**
     * 扫码界面
     */
    public static void scan(Activity activity){
        new IntentIntegrator(activity)
                //.setCaptureActivity(ScanActivity.class)
                .setDesiredBarcodeFormats(IntentIntegrator.QR_CODE_TYPES)// 扫码的类型,可选:一维码,二维码,一/二维码
                .setPrompt("请对准二维码")// 设置提示语
                .setCameraId(0)// 选择摄像头,可使用前置或者后置
                .setBeepEnabled(false)// 是否开启声音,扫完码之后会"哔"的一声
                .setBarcodeImageEnabled(true)// 扫完码之后生成二维码的图片
                .setOrientationLocked(false)
                .initiateScan();// 初始化扫码
    }
}

二维码的生成

    /**
     * 二维码制作
     */
    public static Bitmap encodeAsBitmap(String str){
        Hashtable hints = new Hashtable();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
        Log.v("容错率:",ErrorCorrectionLevel.L+"");
        Bitmap bitmap = null;
        BitMatrix result = null;
        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
        try {
            result = multiFormatWriter.encode(str, BarcodeFormat.QR_CODE, 600, 600,hints);
            // 使用 ZXing Android Embedded 要写的代码
            BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
            bitmap = barcodeEncoder.createBitmap(result);
        } catch (WriterException e){
            e.printStackTrace();
        } catch (IllegalArgumentException iae){ // ?
            return null;
        }
        return bitmap;
    }

二、BGAQRCode-Android

github链接:https://github.com/bingoogolapple/BGAQRCode-Android
参考:https://blog.csdn.net/fanxudonggreat/article/details/76595587

1.引包

compile 'cn.bingoogolapple:bga-qrcode-zxing:1.2.1'

2.ScanActivity

public class ScanActivity extends AppCompatActivity implements QRCodeView.Delegate{

    private QRCodeView qRCodeView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan);

        qRCodeView = (QRCodeView)findViewById(R.id.zxingview);
        qRCodeView.setDelegate(this);
    }

    @Override
    public void onScanQRCodeSuccess(String result) {
        Toast.makeText(ScanActivity.this,result,Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onScanQRCodeOpenCameraError() {

    }

    @Override
    protected void onStart() {
        super.onStart();
        qRCodeView.startSpotAndShowRect();
    }

    @Override
    protected void onStop() {
        qRCodeView.stopCamera();
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        qRCodeView.onDestroy();
        super.onDestroy();
    }
}

3.布局文件 activity_scan.xml

    

二维码的生成

    private void createEnglishQRCode() {
        /*
        这里为了偷懒,就没有处理匿名 AsyncTask 内部类导致 Activity 泄漏的问题
        请开发在使用时自行处理匿名内部类导致Activity内存泄漏的问题,处理方式可参考 https://github.com/GeniusVJR/LearningNotes/blob/master/Part1/Android/Android%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%E6%80%BB%E7%BB%93.md
         */
        new AsyncTask() {
            @Override
            protected Bitmap doInBackground(Void... params) {
                return QRCodeEncoder.syncEncodeQRCode("bingoogolapple", BGAQRCodeUtil.dp2px(TestGeneratectivity.this, 150), Color.parseColor("#ff0000"));
            }

            @Override
            protected void onPostExecute(Bitmap bitmap) {
                if (bitmap != null) {
                    mEnglishIv.setImageBitmap(bitmap);
                } else {
                    Toast.makeText(TestGeneratectivity.this, "生成英文二维码失败", Toast.LENGTH_SHORT).show();
                }
            }
        }.execute();
    }

你可能感兴趣的:(二维码扫描)