zxing相机肖像模式和Android上的风景

时间:2014-05-01 07:20:05

标签: android eclipse zxing barcode-scanner portrait

我已经在我的应用程序中集成了zxing库。现在我希望zxing相机可以在模式风景和肖像模式下工作。现在它只在一种模式下工作。有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

我使用了 compyutech 的答案,但有些东西丢失了。所以,我在这里提出了所需的一切。

<强> 1。 CameraConfigurationManager: 在initFromCameraParameters方法内:

if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
    camera.setDisplayOrientation(90);
}

也从同一方法中删除此代码:

    if (width < height) {
        Log.i(TAG, "Display reports portrait orientation; assuming this is incorrect");
        int temp = width;
        width = height;
        height = temp;
    }

<强> 2。 CameraManager: class variables

private static final int MIN_FRAME_WIDTH = 340;
private static final int MIN_FRAME_HEIGHT = 240;
private static final int MAX_FRAME_WIDTH = 1200;
private static final int MAX_FRAME_HEIGHT = 675;

getFramingRect方法:

public synchronized Rect getFramingRect() {
    if (framingRect == null) {
      if (camera == null) {
        return null;
      }
      Point screenResolution = configManager.getScreenResolution();
      if (screenResolution == null) {
        // Called early, before init even finished
        return null;
      }

        // Code added to enable portrait mode
        int width = MIN_FRAME_WIDTH;
        int height = MIN_FRAME_HEIGHT;
        if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
            int tmp = 7 * screenResolution.x / 8; 
            width = (tmp) < MIN_FRAME_WIDTH ? MIN_FRAME_WIDTH : (tmp);

            tmp = 1 * screenResolution.y / 3;
            height = (tmp) < MIN_FRAME_WIDTH ? MIN_FRAME_WIDTH : ((tmp) > MAX_FRAME_HEIGHT ? MAX_FRAME_HEIGHT : (tmp));
            Log.d(TAG, "Customized code for portrait mode in getFramingRect executed (Piyush Merja) ");
        }else{
            // Original Code
            width = findDesiredDimensionInRange(screenResolution.x, MIN_FRAME_WIDTH, MAX_FRAME_WIDTH);
            height = findDesiredDimensionInRange(screenResolution.y, MIN_FRAME_HEIGHT, MAX_FRAME_HEIGHT);
        }
        // End

      int leftOffset = (screenResolution.x - width) / 2;
      int topOffset = (screenResolution.y - height) / 2;
      framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);
      Log.d(TAG, "Calculated framing rect: " + framingRect);
    }
    return framingRect;
  }

  private static int findDesiredDimensionInRange(int resolution, int hardMin, int hardMax) {
    int dim = 5 * resolution / 8; // Target 5/8 of each dimension
    if (dim < hardMin) {
      return hardMin;
    }
    if (dim > hardMax) {
      return hardMax;
    }
    return dim;
  }

getFramingRectInPreview方法:

public synchronized Rect getFramingRectInPreview() {
    if (framingRectInPreview == null) {
      Rect framingRect = getFramingRect();
      if (framingRect == null) {
        return null;
      }
      Rect rect = new Rect(framingRect);
      Point cameraResolution = configManager.getCameraResolution();
      Point screenResolution = configManager.getScreenResolution();
      if (cameraResolution == null || screenResolution == null) {
        // Called early, before init even finished
        return null;
      }

      // Code added to enable portrait mode
        if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
            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;
            Log.d(TAG, "Customized code for portrait mode in getFramingRectInPreview executed (Piyush Merja) ");
        }else{
            // Original code commented
            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;
        }
        // End
        framingRectInPreview = rect;//this was missing in compyutech's answer
    }
    return framingRectInPreview;
  }

第3。 DecodeHandler:

decode方法内:

    long start = System.currentTimeMillis();
    Result rawResult = null;

    // Code added to enable portrait mode
    if (activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
        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];
        }
        data = rotatedData;
        int tmp = width;
        width = height;
        height = tmp;
        Log.d(TAG, "Customized code for portrait mode in decode executed (Piyush Merja) ");

    }//end

    PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height);

<强> 4。 AndroidManifest.xml:

删除CaptureActivity的方向设置。

答案 1 :(得分:2)

谷歌这个问题。

我使用了zxing zxing 2.3及以下解决方案为我工作。

1在CameraConfigurationManager类中,setDesiredCameraParameters方法在下面的代码中添加以下代码

- &GT; Camera.Parameters parameters = camera.getParameters();

 if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        camera.setDisplayOrientation(90);
 }

2在CameraManager类中,getFramingRect方法替换代码如下

int width = MIN_FRAME_WIDTH; int height = MIN_FRAME_HEIGHT;
if (context.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) {
   int tmp = 7 * screenResolution.x / 8; 
   width = (tmp) < MIN_FRAME_WIDTH ? MIN_FRAME_WIDTH : (tmp);                   
   tmp = 1 * screenResolution.y / 3;
   height = (tmp) < MIN_FRAME_WIDTH ? MIN_FRAME_WIDTH : ((tmp) > MAX_FRAME_HEIGHT ?  MAX_FRAME_HEIGHT : (tmp));
}else{
   // Original Code
   width = findDesiredDimensionInRange(screenResolution.x, MIN_FRAME_WIDTH, > MAX_FRAME_WIDTH);
   height = findDesiredDimensionInRange(screenResolution.y, MIN_FRAME_HEIGHT,  MAX_FRAME_HEIGHT); 
}

3在CameraManager类中,getFramingRectInPreview方法替换代码如下

if (context.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) {
   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;
}else{
   // Original code commented
   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;
}

4在DecodeHandler类中,解码方法在下面的代码行中添加以下代码

- &GT;结果rawResult = null;

 if (activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
        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];
        }
        data = rotatedData;
        int tmp = width;
        width = height;
        height = tmp;

  }

请找到我的工作代码

http://www.compyutech.co.in/repo/zxing-dynamic.zip

希望这会对你有帮助....