您好,登錄后才能下訂單哦!
項目中需要用到條碼掃描功能,花了小半天時間才把zxing整合到項目中。以下說下整合的經驗:
1)從github上下載zxing-master 項目,項目中主要有3個模塊android、android-core、core,其中android-core,core是android模塊依賴的library module. android模塊的最新版本號為4.7.1,android-core和core的版本號為3.1.1.
2) 我用的ide是android studio,使用gradle進行項目管理。首先在項目中導入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版本號編譯時說找不到,只好用3.1.0版本。
3)運行zxing模塊,可以在真機上快速跑起來,掃描功能也很正常。現在主要的任務就是把代碼進行精簡,把里面不需要的資源文件及java文件刪除,最后確保掃描功能還能正常使用就可以了。基本上保留根目錄下的幾個文件和camera整個目錄的內容就差不多了,什么history,share,wifi之類的統統都用不著。還有res下的大部分內容也需要清理,activity只保留CaptureActivity就夠了,把capture.xml中不需要的布局內容也可以刪除掉。
4)把zing模塊改為library類型,在現有的application的build.gradle中加入依賴關系就可以了,在androidManifest中加入CaptureActivity,然后調用試試。結果發現zxing模塊中的部分方法沒有定義為public,訪問不到,改完這個問題后又發現會有常量錯,據說library項目在studio中編譯是R資源文件的內容不會加final導致。解決了之后,程序能運行了,但是本來有的掃描框卻不見了,詭異啊!無奈,最后只好把zxing模塊內容直接拷貝到當前跑的模塊中。最后一切運行正常。
5) 由于我的項目是豎屏操作的,而zxing是橫屏的,為這個事情折騰了很久,在stackoverflow上搜到的答案大多都是適合老版本的操作,幾乎找不到針對最新版4.7.1的。花了大半天的時間最后終于解決了。以下是解決的步驟。
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中getFramingRectInPreview方法
// 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);
好了,現在豎屏掃描可以正常使用了,大功告成。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。