美文网首页
二维码扫描

二维码扫描

作者: 一只在时光里流浪的大懒猫 | 来源:发表于2018-05-21 22:44 被阅读0次

    二维码扫描的话,现在一般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

    <activity
            android:name="com.journeyapps.barcodescanner.CaptureActivity"
            android:screenOrientation="fullSensor"
            tools:replace="screenOrientation" />
    

    调用时

    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

    <?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"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:gravity="center_horizontal"
                  android:orientation="vertical">
    
        <com.journeyapps.barcodescanner.DecoratedBarcodeView
                android:id="@+id/dbv_custom"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:zxing_preview_scaling_strategy="fitXY" />
    
    </LinearLayout>
    

    可以把扫码初始化代码放在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

        <cn.bingoogolapple.qrcode.zxing.ZXingView
            android:id="@+id/zxingview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:qrcv_animTime="1000"
            app:qrcv_borderColor="@android:color/white"
            app:qrcv_borderSize="1dp"
            app:qrcv_cornerColor="@color/colorPrimaryDark"
            app:qrcv_cornerLength="20dp"
            app:qrcv_cornerSize="3dp"
            app:qrcv_maskColor="#33FFFFFF"
            app:qrcv_rectWidth="200dp"
            app:qrcv_scanLineColor="@color/colorPrimaryDark"
            app:qrcv_scanLineSize="1dp"
            app:qrcv_topOffset="90dp" />
    

    二维码的生成

        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<Void, Void, Bitmap>() {
                @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();
        }
    

    相关文章

      网友评论

          本文标题:二维码扫描

          本文链接:https://www.haomeiwen.com/subject/dtmidftx.html