android zxing 4.7.1橫屏改豎屏 screenOrientation landscape to portrait

項目中須要用到條碼掃描功能,花了小半天時間才把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);


好了,如今豎屏掃描能夠正常使用了,大功告成。

相關文章
相關標籤/搜索