前言
最近一個(gè)項(xiàng)目需要添加一個(gè)二維碼掃描登錄的功能,那說(shuō)到二維碼掃描苟翻,不得不提的是Google一個(gè)開(kāi)源的掃碼框架:zxing搭伤。
zxing是基于多種1D/2D條碼處理的開(kāi)源庫(kù),是一個(gè)完整的項(xiàng)目袜瞬。它可以通過(guò)手機(jī)攝像頭實(shí)現(xiàn)條碼的掃描以及解碼怜俐,功能及其強(qiáng)大。
開(kāi)源地址:https://github.com/zxing/zxing/
那么如果僅僅只是要實(shí)現(xiàn)二維碼的掃描以及解碼的話邓尤,不足以用到所有代碼拍鲤,需要在該開(kāi)源項(xiàng)目的基礎(chǔ)上進(jìn)行簡(jiǎn)化,提煉出所需要的代碼部分汞扎。
源碼的具體細(xì)節(jié)就不多闡述了季稳,網(wǎng)上一大堆的詳解,這次主要講的是在如何快速在項(xiàng)目集成zxing二維碼以及在集成時(shí)遇到的一些問(wèn)題澈魄。
集成
準(zhǔn)備好簡(jiǎn)化后的zxing代碼(代碼下載地址在文章末尾給出)要想集成至項(xiàng)目相當(dāng)簡(jiǎn)單景鼠。
第一步
將其以library形式導(dǎo)入項(xiàng)目中。
第二步
在你需要調(diào)用的地方,跳轉(zhuǎn)至CaptureActivity即可。
private static final int REQUEST_CODE_SCAN = 0x0000;
getEditIpAccountFab().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), CaptureActivity.class);
getActivity().startActivityForResult(intent, REQUEST_CODE_SCAN);
}
第三步:
接收掃碼結(jié)果的回傳铛漓。
//先取出二維碼的內(nèi)容
String content = data.getStringExtra(DECODED_CONTENT_KEY);
//在對(duì)字符串進(jìn)行截取,然后解析溯香。我是用#號(hào)用來(lái)區(qū)分IP及端口號(hào)(形式:XXXXXXX#XXXX)
Configure.setString(Configure.SocketClientRemoteIP, content.substring(0,content.indexOf("#")));
Configure.setString(Configure.SocketClientRemotePort, content.substring(content.indexOf("#")+1,content.indexOf("#",content.indexOf("#")+1)));
二維碼解析后無(wú)非就是一段字符串,根據(jù)個(gè)人不同的需求浓恶,對(duì)字符串進(jìn)行截取玫坛,解析即可。
完整代碼:
private static final int REQUEST_CODE_SCAN = 0x0000;
private static final String DECODED_CONTENT_KEY = "codedContent";
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 掃描二維碼回傳
if (requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK) {
if (data != null) {
String content = data.getStringExtra(DECODED_CONTENT_KEY);
Configure.setString(Configure.SocketClientRemoteIP, content.substring(0,content.indexOf("#")));
Configure.setString(Configure.SocketClientRemotePort, content.substring(content.indexOf("#")+1,content.indexOf("#",content.indexOf("#")+1)));
AssistantSocketClient.getInstance().connect();
if (!AssistantSocketClient.getInstance().isDisconnected()){
mMediaPcSettingController.getConnect_or_discon().setText("斷開(kāi)連接");
mMediaPcSettingController.getEditIpAccountFab().setIcon(R.drawable.ic_mode_fork_white_24dp);
}
}
}
}
問(wèn)題
一開(kāi)始集成完了之后包晰,就馬上進(jìn)行測(cè)試湿镀,但是發(fā)現(xiàn)了一個(gè)問(wèn)題,攝像頭居然是顛倒得伐憾,于是我就立馬上網(wǎng)查找相關(guān)資料勉痴,發(fā)現(xiàn)原來(lái)是手機(jī)在出廠時(shí)攝像頭是倒置得,于是馬上用了別的機(jī)型測(cè)試后發(fā)現(xiàn)一切正常(吐槽:android不同機(jī)型之間得適配真的是麻煩啊树肃。蚀腿。),那問(wèn)題還是得解決吧扫外,既然它是倒置那就我們手動(dòng)將攝像機(jī)得參數(shù)修改回來(lái)就行了莉钙,不多說(shuō)直接上代碼:
public void setCameraDisplayOrientation(Activity activity) {
android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(0, info);
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(result);
}
使用
只需在打開(kāi)相機(jī)設(shè)備時(shí)調(diào)用該方法即可~這樣就能適配所有機(jī)型拉。
ps:這個(gè)簡(jiǎn)化后的zxing代碼已經(jīng)將這部分內(nèi)同添加進(jìn)去了筛谚,所以只要按照上面得方法將此份代碼作為library集成之后就都不會(huì)有問(wèn)題拉~
文末
因?yàn)樽约阂彩翘幱趯W(xué)習(xí)階段磁玉,寫(xiě)寫(xiě)博客也只是為了,把自己遇到過(guò)得問(wèn)題記錄下來(lái)驾讲,如果能幫到大家那是最好不過(guò)得拉蚊伞,但是如果有哪些寫(xiě)的不對(duì)得地方也請(qǐng)指出~~大家共同學(xué)習(xí)。
接著附上代碼連接:
http://pan.baidu.com/s/1nvHPsP7