一、环境依赖
IDE:Android Studio
版本管理:gradle
依赖
implementation \'com.journeyapps:zxing-android-embedded:3.3.0\'implementation \'com.google.zxing:core:3.2.1\'
二、构建扫码Activity
创建个Activity
package com.tmri.license.activity;import android.app.Activity;import android.content.pm.PackageManager;import android.os.Bundle;import android.os.PersistableBundle;import android.view.KeyEvent;import android.view.View;import android.view.Window;import android.widget.Button;import android.widget.Toast;import com.journeyapps.barcodescanner.CaptureManager;import com.journeyapps.barcodescanner.DecoratedBarcodeView;import com.tmri.license.R;/*** 摄像头*/public class CustomScanActivity extends Activity implements DecoratedBarcodeView.TorchListener {Button swichLight;DecoratedBarcodeView mDBV;private CaptureManager captureManager;private boolean isLightOn = false;@Overrideprotected void onPause() {super.onPause();captureManager.onPause();}@Overrideprotected void onResume() {super.onResume();captureManager.onResume();}@Overrideprotected void onDestroy() {super.onDestroy();captureManager.onDestroy();}@Overridepublic void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {super.onSaveInstanceState(outState, outPersistentState);captureManager.onSaveInstanceState(outState);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {return mDBV.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.requestWindowFeature( Window.FEATURE_NO_TITLE);//去掉标题栏setContentView( R.layout.activity_custom_scan);swichLight = (Button) findViewById( R.id.btn_switch );mDBV = (DecoratedBarcodeView) findViewById( R.id.dbv_custom );mDBV.setTorchListener(this);// 如果没有闪光灯功能,就去掉相关按钮if(!hasFlash()) {swichLight.setVisibility(View.GONE);}else{swichLight.setOnClickListener( new View.OnClickListener() {@Overridepublic void onClick(View v) {if(isLightOn){mDBV.setTorchOff();}else{mDBV.setTorchOn();}}} );}//重要代码,初始化捕获captureManager = new CaptureManager(this,mDBV);captureManager.initializeFromIntent(getIntent(),savedInstanceState);captureManager.decode();}// torch 手电筒@Overridepublic void onTorchOn() {Toast.makeText(this,\"torch on\",Toast.LENGTH_LONG).show();isLightOn = true;}@Overridepublic void onTorchOff() {Toast.makeText(this,\"torch off\", Toast.LENGTH_LONG).show();isLightOn = false;}// 判断是否有闪光灯功能private boolean hasFlash() {return getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);}}
扫码界面代码
<?xml version=\"1.0\" encoding=\"utf-8\"?><RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"xmlns:tools=\"http://schemas.android.com/tools\"xmlns:app=\"http://schemas.android.com/apk/res-auto\"android:layout_width=\"match_parent\"android:layout_height=\"match_parent\"android:orientation=\"vertical\"android:gravity=\"center_horizontal\"android:background=\"#05000000\"tools:context=\"com.tmri.license.activity.CustomScanActivity\"><!-- 我这里只是在大局下修改了一些样式,不过其实 扫描框中的 各种激光条,边框都可以改变,有兴趣的同学可以自己去搜一下 --><!-- 这个控件就是扫描的窗口了 --><com.journeyapps.barcodescanner.DecoratedBarcodeViewandroid:layout_width=\"match_parent\"android:layout_height=\"match_parent\"android:id=\"@+id/dbv_custom\"android:layout_gravity=\"center\"android:gravity=\"center\"app:zxing_framing_rect_width=\"250dp\"app:zxing_framing_rect_height=\"250dp\"app:zxing_preview_scaling_strategy=\"fitXY\"app:zxing_use_texture_view=\"true\"></com.journeyapps.barcodescanner.De3e6fcoratedBarcodeView><GridLayoutandroid:layout_width=\"match_parent\"android:layout_height=\"match_parent\"android:layout_alignParentStart=\"true\"android:layout_alignParentTop=\"true\"android:columnCount=\"1\"android:focusable=\"true\"android:focusableInTouchMode=\"true\"android:orientation=\"horizontal\"><Buttonandroid:id=\"@+id/btn_switch\"android:layout_width=\"50dp\"android:layout_height=\"50dp\"android:layout_gravity=\"center\"android:layout_marginTop=\"350dp\"android:background=\"@drawable/sdt\" /></GridLayout></RelativeLayout>
三、调用
调用出扫码界面
public void customScan(){new IntentIntegrator(MainActivity.this).setOrientationLocked(false).setCaptureActivity(CustomScanActivity.class) // 设置自定义的activity是CustomActivity.initiateScan(); // 初始化扫描}
返回扫码结果
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);try {// 扫描二维码/条码回传 requestCode == REQUEST_CODE_SCAN &&if (resultCode == RESULT_OK) {//如果二维码是byte数组格式,这样获取byte[] bytes = data.getByteArrayExtra(\"SCAN_RESULT_BYTE_SEGMENTS_0\");//如果是文本格式如下获取IntentResult intentResult = IntentIntegrator.parseActivityResult( requestCode, resultCode, data );if(intentResult != null) {if(intentResult.getContents() == null) {Toast.makeText(MainActivity.this,\"内容为空\",Toast.LENGTH_LONG).show();} else {// ScanResult 为 获取到的字符串String scanResult = intentResult.getContents();}}}} catch (Exception e){Toast.makeText(MainActivity.this,e.getMessage(),Toast.LENGTH_LONG).show();}}