項目中須要用到條碼掃描功能,花了小半天時間才把zxing整合到項目中。如下說下整合的經驗:java
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.android
2) 我用的ide是android studio,使用gradle進行項目管理。首先在項目中導入android模塊,命名爲zxing,在build.gradle中加入依賴git
dependencies {github
compile 'com.google.zxing:android-core:3.1.0'app
compile 'com.google.zxing:core:3.1.0'ide
}佈局
注:gradle
因爲gradle中3.1.1版本號編譯時說找不到,只好用3.1.0版本。ui
3)運行zxing模塊,能夠在真機上快速跑起來,掃描功能也很正常。如今主要的任務就是把代碼進行精簡,把裏面不須要的資源文件及java文件刪除,最後確保掃描功能還能正常使用就能夠了。基本上保留根目錄下的幾個文件和camera整個目錄的內容就差很少了,什麼history,share,wifi之類的通通都用不着。還有res下的大部份內容也須要清理,activity只保留CaptureActivity就夠了,把capture.xml中不須要的佈局內容也能夠刪除掉。google
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);
好了,如今豎屏掃描能夠正常使用了,大功告成。