您好,登錄后才能下訂單哦!
項(xiàng)目中需要用到條碼掃描功能,花了小半天時(shí)間才把zxing整合到項(xiàng)目中。以下說(shuō)下整合的經(jīng)驗(yàn):
1)從github上下載zxing-master 項(xiàng)目,項(xiàng)目中主要有3個(gè)模塊android、android-core、core,其中android-core,core是android模塊依賴的library module. android模塊的最新版本號(hào)為4.7.1,android-core和core的版本號(hào)為3.1.1.
2) 我用的ide是android studio,使用gradle進(jìn)行項(xiàng)目管理。首先在項(xiàng)目中導(dǎo)入android模塊,命名為zxing,在build.gradle中加入依賴
dependencies {
compile 'com.google.zxing:android-core:3.1.0'
compile 'com.google.zxing:core:3.1.0'
}
注:
由于gradle中3.1.1版本號(hào)編譯時(shí)說(shuō)找不到,只好用3.1.0版本。
3)運(yùn)行zxing模塊,可以在真機(jī)上快速跑起來(lái),掃描功能也很正常?,F(xiàn)在主要的任務(wù)就是把代碼進(jìn)行精簡(jiǎn),把里面不需要的資源文件及java文件刪除,最后確保掃描功能還能正常使用就可以了。基本上保留根目錄下的幾個(gè)文件和camera整個(gè)目錄的內(nèi)容就差不多了,什么history,share,wifi之類的統(tǒng)統(tǒng)都用不著。還有res下的大部分內(nèi)容也需要清理,activity只保留CaptureActivity就夠了,把capture.xml中不需要的布局內(nèi)容也可以刪除掉。
4)把zing模塊改為library類型,在現(xiàn)有的application的build.gradle中加入依賴關(guān)系就可以了,在androidManifest中加入CaptureActivity,然后調(diào)用試試。結(jié)果發(fā)現(xiàn)zxing模塊中的部分方法沒(méi)有定義為public,訪問(wèn)不到,改完這個(gè)問(wèn)題后又發(fā)現(xiàn)會(huì)有常量錯(cuò),據(jù)說(shuō)library項(xiàng)目在studio中編譯是R資源文件的內(nèi)容不會(huì)加final導(dǎo)致。解決了之后,程序能運(yùn)行了,但是本來(lái)有的掃描框卻不見(jiàn)了,詭異??!無(wú)奈,最后只好把zxing模塊內(nèi)容直接拷貝到當(dāng)前跑的模塊中。最后一切運(yùn)行正常。
5) 由于我的項(xiàng)目是豎屏操作的,而zxing是橫屏的,為這個(gè)事情折騰了很久,在stackoverflow上搜到的答案大多都是適合老版本的操作,幾乎找不到針對(duì)最新版4.7.1的?;舜蟀胩斓臅r(shí)間最后終于解決了。以下是解決的步驟。
5.1)AndroidManifest中CaptureActivity的screenOrientation屬性改為portrait
5.2)CaptureActivity中把onResume方法中的
// if (prefs.getBoolean(PreferencesActivity.KEY_DISABLE_AUTO_ORIENTATION, true)) {
// setRequestedOrientation(getCurrentOrientation());
// } else {
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
// }
這段注釋掉,在onCreate方法的最后添加:
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
5.3)CameraManager中g(shù)etFramingRectInPreview方法
// rect.left = rect.left * cameraResolution.x / screenResolution.x;
// rect.right = rect.right * cameraResolution.x / screenResolution.x;
// rect.top = rect.top * cameraResolution.y / screenResolution.y;
// rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;
把這段注釋掉,改為:
rect.left = rect.left * cameraResolution.y / screenResolution.x;
rect.right = rect.right * cameraResolution.y / screenResolution.x;
rect.top = rect.top * cameraResolution.x / screenResolution.y;
rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;
5.4)CameraConfigurationManager的setDesiredCameraParameters方法的camera.setParameters(parameters);之前添加:
camera.setDisplayOrientation(90);
5.5)DecodeHandler的private void decode(byte[] data, int width, int height) 方法中PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height);注釋掉,改為:
byte[] rotatedData = new byte[data.length];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++)
rotatedData[x * height + height - y - 1] = data[x + y * width];
}
int tmp = width;
width = height;
height = tmp;
PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(rotatedData, width, height);
好了,現(xiàn)在豎屏掃描可以正常使用了,大功告成。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。