1.在build文件中添加依賴
dependencies {
//ZXing
implementation 'com.google.zxing:core:3.3.3'
implementation('com.journeyapps:zxing-android-embedded:3.6.0') { transitive = false }
2.之后只需要一行代碼就可以調用掃碼功能
new IntentIntegrator(this).initiateScan();
然后在當前的Activity中重寫onActivityResult去獲取結果就ok了
3.自定義掃碼界面
因為掃碼界面的代碼非常少,所以可以新建一個Activity復制它的代碼。
- 新建一個Activity
package com.onepilltest.index;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import com.journeyapps.barcodescanner.CaptureManager;
import com.journeyapps.barcodescanner.DecoratedBarcodeView;
import com.onepilltest.R;
public class ZxingActivity extends AppCompatActivity {
private CaptureManager capture;
private DecoratedBarcodeView bv_barcode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(0xffffffff);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
setContentView(R.layout.zxing);
bv_barcode = (DecoratedBarcodeView) findViewById(R.id.bv_barcode);
capture = new CaptureManager(this, bv_barcode);
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 bv_barcode.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
}
}
- 然后是View
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
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=".Activity.ScanQRCodeActivity">
<com.journeyapps.barcodescanner.DecoratedBarcodeView
android:id="@+id/bv_barcode"
app:zxing_use_texture_view="false"
app:zxing_preview_scaling_strategy="centerCrop"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.constraint.ConstraintLayout>
其中DecoratedBarcodeView,它就是掃描界面的核心。
- 接下來更改跳轉代碼
new IntentIntegrator(this).setCaptureActivity(ScanQRCodeActivity.class).initiateScan();
上面的方法中多了一個setCaptureActivity()方法,這個方法看源碼非常簡單了,調用這個方法可以把默認的CaptureActivity替換為我們自定義的ScanQRCodeActivity。
- 重寫onActivityResult()方法,獲取返回的參數
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
Log.e("掃碼結果分析", "Cancelled");
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (result != null) {
if (result.getContents() == null) {
Toast.makeText(this, "掃描結果為空", Toast.LENGTH_LONG).show();
} else {
String str = result.getContents();
Toast.makeText(this, str, Toast.LENGTH_LONG).show();
}
}
}
4.如果想停留在當前Activity
可以注釋capture.decode();
然后添加
//回調
private BarcodeCallback barcodeCallback = new BarcodeCallback() {
@Override
public void barcodeResult(BarcodeResult result) {
if (result != null){
Log.e(getClass().getName(), "獲取到的掃描結果是:" + result.getText());
Toast.makeText(getApplicationContext(),result.getText(),Toast.LENGTH_SHORT).show();
textView.setText(result.getText());
}
}
@Override
public void possibleResultPoints(List<ResultPoint> resultPoints) {
}
};
然后再添加代碼bv_barcode.decodeSingle(this.barcodeCallback);
設置回調函數。
5.如果想連續掃描
將代碼替換
// bv_barcode.decodeSingle(this.barcodeCallback);//單次掃描
bv_barcode.decodeContinuous(barcodeCallback);//連續掃描
然后在回調方法和處理方法中添加以下分別調用以下函數
//回調
private BarcodeCallback barcodeCallback = new BarcodeCallback() {
@Override
public void barcodeResult(BarcodeResult result) {
bv_barcode.resume();
if (result != null){
Log.e(getClass().getName(), "獲取到的掃描結果是:" + result.getText());
String myresult = result.getText();
if (!results.equals(myresult)){
results = myresult;
Toast.makeText(getApplicationContext(),result.getText(),Toast.LENGTH_SHORT).show();
textView.setText(result.getText());
}
bv_barcode.resume();
}
}
參考:生成二維碼和保存二維碼