Android快速實(shí)現(xiàn)二維碼掃描
添加時(shí)間:2019-08-31 16:04:02
來源:
Android中二維碼掃描的最常用庫(kù)是zxing和zbar,zxing項(xiàng)目地址為https://github.com/zxing/zxing,目前還有多個(gè)人在維護(hù)。zbar主要用C來寫的,對(duì)速度有要求的可使用zbar,但目前沒有在維護(hù),項(xiàng)目地址:https://github.com/ZBar/ZBar。
Zxing
之前做畢業(yè)設(shè)計(jì)的時(shí)候用到了二維碼掃描功能,github上Zxing項(xiàng)目代碼很多,但其實(shí)用到的只有一部分,由于趕時(shí)間所以打算找個(gè)精簡(jiǎn)的快速集成,這里分享一下集成過程,比較實(shí)用。
國(guó)際慣例,先上效果圖:

1.引入jar包

2.copy Zxing包到項(xiàng)目

這里包名不一樣肯定會(huì)報(bào)錯(cuò),我們暫時(shí)不管,先把資源文件copy過來,后面來做處理。
3.導(dǎo)入相關(guān)資源文件
copy res底下的相關(guān)資源文件,如下:
drawable、drawable-hdpi和layout

raw文件和values文件

注:values中相關(guān)資源不要直接替換,否則會(huì)覆蓋之前的,需要打開文件將內(nèi)容加到自己項(xiàng)目對(duì)應(yīng)文件中。
4.AndroidManifest.xml加入相關(guān)權(quán)限和掃描的Activity
<uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.VIBRATE" /><uses-permission android:name="android.permission.FLASHLIGHT" />
<activity android:name=".zxing.android.CaptureActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar" />
5.Clean Projects,修改報(bào)錯(cuò)的類
報(bào)錯(cuò)無非就是包名不對(duì),修改為自己包名即可

6.capture.xml的ViewfinderView改成自己包名下的

7.調(diào)起掃描界面 獲取掃描結(jié)果
在需要打開掃描界面的地方直接跳轉(zhuǎn)到CaptureActivity就OK(使用startActivityForResult)
/**
* 跳轉(zhuǎn)到掃碼界面掃碼 */private void goScan(){
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
startActivityForResult(intent, REQUEST_CODE_SCAN);
}在onActivityResult的回調(diào)中即可獲取掃描內(nèi)容
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 掃描二維碼/條碼回傳
if (requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK) { if (data != null) { //返回的文本內(nèi)容
String content = data.getStringExtra(DECODED_CONTENT_KEY); //返回的BitMap圖像
Bitmap bitmap = data.getParcelableExtra(DECODED_BITMAP_KEY);
}
}
}
由于掃描需要調(diào)用相機(jī),打開攝像頭屬于敏感權(quán)限,所以需要進(jìn)行權(quán)限的動(dòng)態(tài)申請(qǐng),如下
//動(dòng)態(tài)權(quán)限申請(qǐng)if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 1);
} else { //掃碼 goScan();
}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case 1: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //掃碼 goScan();
} else {
Toast.makeText(this, "你拒絕了權(quán)限申請(qǐng),無法打開相機(jī)掃碼喲!", Toast.LENGTH_SHORT).show();
} break; default:
}
}
上面的代碼就是動(dòng)態(tài)申請(qǐng)權(quán)限的流程,首先判斷用戶是不是已經(jīng)給我們權(quán)限授權(quán)了,使用ContextCompat.checkSelfPermission()方法,第一個(gè)參數(shù)是Context,第二個(gè)參數(shù)是具體的權(quán)限名稱,如果等于PackageManager.PERMISSION_GRANTED表明已授權(quán),不等于就是沒有授權(quán)。
如果已授權(quán)就直接做后面的操作,如果沒有授權(quán),需要調(diào)用ActivityCompat.requestPermissions()方法申請(qǐng)授權(quán),第一個(gè)參數(shù)是當(dāng)前Activity實(shí)例,第二個(gè)參數(shù)是權(quán)限數(shù)組,第三個(gè)是請(qǐng)求碼。
用戶的選擇將會(huì)回調(diào)到onRequestPermissionsResult()方法中,授權(quán)結(jié)果封裝在grantResults參數(shù)中,如果grantResults長(zhǎng)度大于0且grantResults[0]等于PackageManager.PERMISSION_GRANTED,也就是上面權(quán)限數(shù)組中加入的第一個(gè)打開攝像頭的權(quán)限被授權(quán),則可跳轉(zhuǎn)至掃描界面掃碼,否則提示用戶未打開權(quán)限無法使用。
打開個(gè)6.0以上模擬器試試

點(diǎn)擊按鈕將彈出權(quán)限申請(qǐng),用戶授權(quán)后方可進(jìn)行二維碼掃描。
2019-08
Android中二維碼掃描的最常用庫(kù)是zxing和zbar,zxing項(xiàng)目地址為https://github.com/zxing/zxing,目前還有多個(gè)人在維護(hù)。zbar主要用C來寫的,對(duì)速度有要求的可使用zbar,但目前沒有在維護(hù),項(xiàng)目地址:https://github.…… [了解更多]
地 址:中國(guó)(上海)自由貿(mào)易試驗(yàn)區(qū)臨港新片區(qū)平港路883-885號(hào)1幢
郵政編碼:201411
電 話:13761963296
郵 箱:847098433@qq.com
投訴郵 箱:info@xtvu.com