1. 程式人生 > >QRCode二維碼掃描和生成

QRCode二維碼掃描和生成

使用zxing的第三方抽取包,簡單的幾行程式碼就可以完成。

首先,下載第三方抽取包libzxing

將其按一個model匯入到我們建好的app中,新增model引用,新增許可權。

model倒入後的結構如圖:


注意:因為許可權問題,我們在主程式程式碼中有一大段是對許可權的請求,有註釋。

現在看程式碼:

首先是佈局檔案:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context="com.devin.qrcodedemo.MainActivity">
    <TextView
        android:id="@+id/txt_result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn_scan_qrcode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="掃描二維碼" />
    <EditText
        android:id="@+id/et_code"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/btn_gen"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="生成二維碼"/>
    <ImageView
        android:id="@+id/img_qrcode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"/>
</LinearLayout>

然後是主程式碼:
/**
 * 二維碼快速解析和生成
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private static final int REQUEST_CODE = 0x0001;//請求碼
    private static final int REQUEST_PERMISSION_CAMERA_CODE = 0x0001;//相機許可權請求碼
    private Button btnScan;//啟動掃描
    private Button btnGen;//生成二維碼
    private TextView txtResult;//顯示返回的掃描結果
    private EditText etCode;//生成二維碼的文字
    private ImageView imgQRCode;//顯示生成的二維碼影象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        checkPermission();
    }

    /**
     * 檢查許可權
     */
    private void checkPermission() {
        //獲得攝像頭許可權狀態
        int permissionCamera = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
        //如果沒有許可權
        if (permissionCamera != PackageManager.PERMISSION_GRANTED) {
            //請求許可權
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA_CODE);
        } else {
            initListener();
        }
    }

    /**
     * 請求許可權
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_PERMISSION_CAMERA_CODE) {
            if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                initListener();
            }
        }
    }

    /**
     * 初始化
     */
    private void initView() {
        btnScan = (Button) findViewById(R.id.btn_scan_qrcode);
        btnGen = (Button) findViewById(R.id.btn_gen);
        txtResult = (TextView) findViewById(R.id.txt_result);
        etCode = (EditText) findViewById(R.id.et_code);
        imgQRCode = (ImageView) findViewById(R.id.img_qrcode);
    }

    /**
     * 處理返回的掃描結果
     *
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                //獲取到解析好的二維碼文字
                String result = data.getExtras().getString("result");
                txtResult.setText(result);
            }
        }
    }

    /**
     * 初始化按鈕點選監聽
     */
    private void initListener() {
        btnScan.setOnClickListener(this);
        btnGen.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_scan_qrcode:
                startSacn();
                break;
            case R.id.btn_gen:
                startGen();
                break;
            default:
                break;
        }
    }

    /**
     * 生成二維碼
     */
    private void startGen() {
        String content = etCode.getText().toString();
        if ("".equalsIgnoreCase(content)){
            Toast.makeText(this, "內容不能為空", Toast.LENGTH_SHORT).show();
        }else {
            //呼叫工具類EncodingUtils生成二維碼圖片
            Bitmap qrCode = EncodingUtils.createQRCode(content, 600, 600, BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
            imgQRCode.setImageBitmap(qrCode);
        }
    }

    /**
     * 進入掃描介面
     */
    private void startSacn() {
        Intent intent = new Intent(this, CaptureActivity.class);
        startActivityForResult(intent, REQUEST_CODE);
    }
}

就兩個檔案。很簡單。感謝開源庫的作者和做抽取的朋友。

如果對掃描框不滿意可以去修改。

看看效果: