QR code Zxing & Zbar, zxing
QR code Zxing & Zbar
Preface:This project mainly introduces QR code scanning, flash enabling, local QR code image recognition, and QR code generation. Zxing and zbar (grid QR code) are implemented respectively. Run the project apk for specific effects...
Development Environment: AndroidStudio2.2.1 + gradle-2.14.1
Knowledge:
1. Zxing and Zbar (GRID) QR code scanning
2. Enable and disable the flashlight
3. Local QR code recognition
4. QR code generation
5. Handler Mechanism
6. butterknife annotation-based development
Introduce dependency:
compile 'com.android.support:appcompat-v7:22.+' compile 'com.google.zxing:core:3.2.1' compile 'com.jakewharton:butterknife:7.0.1' compile files('libs/zbar.jar')
Some code:
/*** Zbar QR code scan + flashlight + local QR code recognition */public class ZbarActivity extends AppCompatActivity implements QRCodeView. delegate {@ Bind (R. id. zbarview) ZBarView mQRCodeView; @ Bind (R. id. scancode_lamplight) ToggleButton toggleButton; @ Override protected void onCreate (Bundle savedInstanceState) {super. onCreate (savedInstanceState); setContentView (R. layout. zbartest_scan_layout); ButterKnife. bind (this); initLayout ();} Private void initLayout () {mQRCodeView. setDelegate (this); mQRCodeView. startSpotAndShowRect (); // display the scan box and start to recognize toggleButton after 1.5 seconds. setOnCheckedChangeListener (new CompoundButton. onCheckedChangeListener () {@ Override public void onCheckedChanged (CompoundButton buttonView, boolean isChecked) {if (isChecked) {mQRCodeView. openFlashlight ();} else {mQRCodeView. closeFlashlight () ;}}) ;}@ OnClick ({R. Id. line_back, R. id. scancode_localimg}) protected void onClickBtn (View view) {switch (view. getId () {case R. id. line_back: finish (); break; case R. id. scancode_localimg: Intent intent = new Intent (); intent. setAction (Intent. ACTION_PICK); intent. setType ("image/*"); startActivityForResult (intent, 0x11); break; default: break ;}@override protected void onActivityResult (int requestCode, int resultCo De, Intent data) {super. onActivityResult (requestCode, resultCode, data); if (resultCode = RESULT_ OK & requestCode = 0x11) {Uri uri = data. getData (); String path = null; if (! TextUtils. isEmpty (uri. getAuthority () {Cursor cursor = getContentResolver (). query (uri, new String [] {MediaStore. images. media. DATA}, null); if (null = cursor) {Toast. makeText (ZbarActivity. this, "image not found", Toast. LENGTH_SHORT ). show (); return;} cursor. moveToFirst (); path = cursor. getString (cursor. getColumnIndex (MediaStore. images. media. DATA); cursor. close ();} else {path = uri. getPath ();} If (null! = Path) {codeDiscriminate (path);} else {Toast. makeText (ZbarActivity. this, "the image path is empty", Toast. LENGTH_SHORT ). show (); return ;}}@ Override protected void onRestart () {mQRCodeView. startCamera (); super. onRestart () ;}@ Override public void onResume () {super. onResume (); mQRCodeView. startSpotAndShowRect (); // display the scan box and start to recognize it after 1.5 seconds.} @ Override protected void onStop () {mQRCodeView. stopCamera (); // mQRCodeVi Ew. closeFlashlight (); super. onStop ();} private void vibrate () {Vibrator vibrator = (Vibrator) getSystemService (VIBRATOR_SERVICE); vibrator. vibrate (200);} private void codeDiscriminate (final String path) {new Thread (new Runnable () {@ Override public void run () {Looper. prepare (); String result = null; if (Build. VERSION. SDK_INT> = Build. VERSION_CODES.KITKAT) {result = QRCodeDecoder. syncDecodeQR Code (path);} else {result = QRCodeDecoder. syncDecodeQRCode2 (path);} Log. I ("zbar_result", Build. VERSION. SDK_INT + "--->" + result); Message msg = mHandler. obtainMessage (); // encapsulate the Message id msg. what = 1; // as the identifier to facilitate message receiving msg. obj = result; mHandler. sendMessage (msg); // send message }}). start () ;}// create a local Hander Class Object and use the handleMessage () Hook method to update the UI Control Handler mHandler = new Handler () {public void handleMessage (Message msg ){ // Obtain the id of the encapsulated message to match if (1 = msg. what) {if (null! = Msg. obj) onScanQRCodeSuccess (msg. obj. toString () ;}};@ Override protected void onDestroy () {mQRCodeView. onDestroy (); ButterKnife. unbind (this); super. onDestroy () ;}@ Override public void onScanQRCodeSuccess (String result) {Log. I ("zbar_result", "result:" + result); Toast. makeText (this, "QR code data:" + result, Toast. LENGTH_SHORT ). show (); vibrate (); mQRCodeView. startSpot () ;}@ Override public void onScanQRCodeOpenCameraError () {Log. e ("zbar_result", "camera error"); Toast. makeText (this, "An error occurred while opening the camera", Toast. LENGTH_SHORT ). show ();}}
Download source code...