二維碼Zxing&Zbar,zxing

來源:互聯網
上載者:User

二維碼Zxing&Zbar,zxing

二維碼Zxing&Zbar

 

前言該項目主要介紹了二維碼掃描、閃光燈開啟、本地二維碼圖片識別、二維碼產生。分別是zxing和zbar(網格二維碼)分別實現,具體效果運行項目apk...

 

開發環境:AndroidStudio2.2.1+gradle-2.14.1

 

涉及知識:
    1.Zxing和Zbar(網格)二維碼掃描
    2.閃光燈開啟與關閉
    3.本地二維碼識別
    4.二維碼產生
    5.Handler機制
    6.butterknife註解式開發

 

引入依賴:

 

    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')

 

部分代碼:

/** * Zbar二維碼掃描+閃光燈+本地二維碼識別 */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();//顯示掃描框,並且延遲1.5秒後開始識別        toggleButton.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 resultCode, 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, null, null);                if (null == cursor) {                    Toast.makeText(ZbarActivity.this, "圖片沒找到", 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, "圖片路徑為空白", Toast.LENGTH_SHORT).show();                return;            }        }    }    @Override    protected void onRestart() {        mQRCodeView.startCamera();        super.onRestart();    }    @Override    public void onResume() {        super.onResume();        mQRCodeView.startSpotAndShowRect();//顯示掃描框,並且延遲1.5秒後開始識別    }    @Override    protected void onStop() {        mQRCodeView.stopCamera();//        mQRCodeView.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.syncDecodeQRCode(path);                } else {                    result = QRCodeDecoder.syncDecodeQRCode2(path);                }                Log.i("zbar_result", Build.VERSION.SDK_INT + "--->" + result);                Message msg = mHandler.obtainMessage();                //封裝訊息id                msg.what = 1;//作為標示,便於接收訊息                msg.obj = result;                mHandler.sendMessage(msg);//發送訊息            }        }).start();    }    //建立一個Hander局部類對象,通過handleMessage()鉤子方法來更新UI控制項    Handler mHandler = new Handler() {        public void handleMessage(Message msg) {            //得到封裝訊息的id進行匹配            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, "二維碼的資料:" + result, Toast.LENGTH_SHORT).show();        vibrate();        mQRCodeView.startSpot();    }    @Override    public void onScanQRCodeOpenCameraError() {        Log.e("zbar_result", "開啟相機出錯");        Toast.makeText(this, "開啟相機出錯", Toast.LENGTH_SHORT).show();    }}

 

 

源碼下載...

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.