Android二维码快速集成

二维码

可以通过开源框架快速集成, zxing是一款Google推出的强大的二维码扫描库,支持多个平台,我们只需要Android核心代码,故依赖大神提取核心包即可。

二维码扫描示例

1. 依赖zxing

在对应模块build.gradle添加

// 添加这两行
implementation 'com.google.zxing:core:3.2.1'      //zxing核心依赖
implementation 'com.journeyapps:zxing-android-embedded:3.3.0'  //生成二维码依赖

2. 二维码生成

ZxingUtil

public class ZxingUtil {
    /**
    * 生成二维码bitmap
    */
    public static Bitmap createBitmap(String str) {
        Bitmap bitmap = null;
        BitMatrix result = null;
        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
        try {
            result = multiFormatWriter.encode(str, BarcodeFormat.QR_CODE, 400, 400);
            BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
            bitmap = barcodeEncoder.createBitmap(result);
        } catch (WriterException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException iae) {
            return null;
        }
        return bitmap;
    }
}

3. 二维码扫描

  1. 为了简便开发使用到ButterKnife框架

在对应模块的build.gradle添加

//添加这两行
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

可能出现如下错误

all com.android.support libraries must use the exact same version specification

这是由于引用的第三方库的支持库版本低于(或者不一致)app build.gradle中的支持库版本

改三方库版本太过麻烦故直接在对应模块中的build.gradle中配置,强制使用推荐版本即可

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == 'com.android.support') {
            if (!requested.name.startsWith("multidex")) {
                details.useVersion '25.3.0' // 笔者studio推荐版本为25.3.0
            }
        }
    }
}


  1. 定义自己的扫描界面

ScanActivity
import android.app.Activity;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.view.KeyEvent;

import com.journeyapps.barcodescanner.CaptureManager;
import com.journeyapps.barcodescanner.DecoratedBarcodeView;
import butterknife.BindView;
import butterknife.ButterKnife;
public class ScanActivity extends Activity {

    @BindView(R.id.dbv)
    DecoratedBarcodeView mDBV;

    private CaptureManager captureManager;     //捕获管理器

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

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

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

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        captureManager.onSaveInstanceState(outState);
    }

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan);
        ButterKnife.bind(this);
        captureManager = new CaptureManager(this, mDBV);
        captureManager.initializeFromIntent(getIntent(), savedInstanceState);
        captureManager.decode();
    }
}

扫描界面布局

activity_scan

<RelativeLayout 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"
    tools:context="com.example.zxingtest.activity.ScanActivity">

    <com.journeyapps.barcodescanner.DecoratedBarcodeView
        android:id="@+id/dbv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:zxing_framing_rect_height="200dp"
        app:zxing_framing_rect_width="200dp"
        app:zxing_preview_scaling_strategy="fitXY"
        app:zxing_use_texture_view="true"></com.journeyapps.barcodescanner.DecoratedBarcodeView>

</RelativeLayout>

4. onActivityResult接收二维码扫描结果

public class MainActivity extends Activity {
    public static final String TAG = "wangyannan";
    @BindView(R.id.iv_qrcode)
    ImageView mImageView;
    @BindView(R.id.tv_string)
    TextView mTvString;

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

    @OnClick({R.id.btn_create, R.id.btn_scan})
    public void click(View view) {
        switch (view.getId()) {
            case R.id.btn_create:
                Bitmap bitmap = ZxingUtil.createBitmap("https://www.baidu.com");
                mImageView.setImageBitmap(bitmap);
                break;
            case R.id.btn_scan:
                Log.i(TAG, "click: btnscan");
                new IntentIntegrator(this)
                        .setOrientationLocked(false)
                        .setCaptureActivity(ScanActivity.class) // 设置自定义的activity是ScanActivity
                        .initiateScan(); // 初始化扫描
                break;
        }

    }
    // 通过onActivityResult接受二维码扫描结果
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if (intentResult != null) {
            if (intentResult.getContents() == null) {
                Toast.makeText(this, "内容为空", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(this, "扫描成功", Toast.LENGTH_LONG).show();
                // ScanResult 为 获取到的字符串
                String ScanResult = intentResult.getContents();
                mTvString.setText(ScanResult);
            }
        } else {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

}

大功告成:)

猜你喜欢

转载自blog.csdn.net/w1070216393/article/details/79879865