ZXing修改为竖屏的具体操作方法

针对网上修改方法与实际源码不符的问题,本文详细介绍了根据当前ZXing源码进行竖屏扫描的修改操作,包括添加权限等关键步骤。

现在网上的修改方法很多,但是好像都跟我下载的源码对不起来,我按这里的源码对我下载的版本进行了修改

1.首先需要添加权限:

 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

2.增加activity

<activity
            android:name="com.google.zxing.client.android.CaptureActivity"
             android:screenOrientation="portrait"
              android:clearTaskOnLaunch="true"
              android:stateNotNeeded="true"
              android:configChanges="orientation|keyboardHidden"
              android:theme="@style/CaptureTheme"
              android:windowSoftInputMode="stateAlwaysHidden"  >

这里的
android:screenOrientation控制了扫描横屏还是竖屏  横屏landscape

3.修改DecodeHandler 
增加一个方法
public byte[] rotateData(byte[] data,int width,int height){
<span style="white-space:pre">		</span>//  //旋转数据
<span style="white-space:pre">		</span>  byte[] rotatedData = new byte[data.length];
<span style="white-space:pre">		</span>  for (int y = 0; y < height; y++) {
<span style="white-space:pre">		</span>      for (int x = 0; x < width; x++)
<span style="white-space:pre">		</span>          rotatedData[x * height + height - y - 1] = data[x + y * width];
<span style="white-space:pre">		</span>  }
<span style="white-space:pre">		</span>    return rotatedData;
<span style="white-space:pre">	</span>  }
对decode(byte[] data, int width, int height)方法进行修改
 PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(<span style="color:#ff6666;">rotateData(data, width, height)</span>, width, height);
4.修改CameraConfigurationManager
因为这里需要修改的地方比较多,我把整个代码拿出来吧
修改initFromCameraParameters
void initFromCameraParameters(Camera camera) {
<span style="white-space:pre">	</span>  Camera.Parameters parameters = camera.getParameters();
<span style="white-space:pre">	</span>    previewFormat = parameters.getPreviewFormat();
<span style="white-space:pre">	</span>    previewFormatString = parameters.get("preview-format");
<span style="white-space:pre">	</span>    Log.d(TAG, "Default preview format: " + previewFormat + '/' + previewFormatString);
<span style="white-space:pre">	</span>    WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
<span style="white-space:pre">	</span>    Display display = manager.getDefaultDisplay();
<span style="white-space:pre">	</span>    screenResolution = new Point(display.getWidth(), display.getHeight());
<span style="white-space:pre">	</span>    Log.d(TAG, "Screen resolution: " + screenResolution);
<span style="white-space:pre">	</span>    cameraResolution = getCameraResolution(parameters, screenResolution);
<span style="white-space:pre">	</span>    Log.d(TAG, "Camera resolution: " + screenResolution);
<span style="white-space:pre">	</span>  }
增加
private int previewFormat;
<span style="white-space:pre">	</span>  private String previewFormatString;
  private static final Pattern COMMA_PATTERN = Pattern.compile(",");
 private static Point getCameraResolution(Camera.Parameters parameters, Point screenResolution) {


<span style="white-space:pre">	</span>    String previewSizeValueString = parameters.get("preview-size-values");
<span style="white-space:pre">	</span>    // saw this on Xperia
<span style="white-space:pre">	</span>    if (previewSizeValueString == null) {
<span style="white-space:pre">	</span>      previewSizeValueString = parameters.get("preview-size-value");
<span style="white-space:pre">	</span>    }


<span style="white-space:pre">	</span>    Point cameraResolution = null;


<span style="white-space:pre">	</span>    if (previewSizeValueString != null) {
<span style="white-space:pre">	</span>      Log.d(TAG, "preview-size-values parameter: " + previewSizeValueString);
<span style="white-space:pre">	</span>      cameraResolution = findBestPreviewSizeValue(previewSizeValueString, screenResolution);
<span style="white-space:pre">	</span>    }


<span style="white-space:pre">	</span>    if (cameraResolution == null) {
<span style="white-space:pre">	</span>      // Ensure that the camera resolution is a multiple of 8, as the screen may not be.
<span style="white-space:pre">	</span>      cameraResolution = new Point(
<span style="white-space:pre">	</span>          (screenResolution.x >> 3) << 3,
<span style="white-space:pre">	</span>          (screenResolution.y >> 3) << 3);
<span style="white-space:pre">	</span>    }


<span style="white-space:pre">	</span>    return cameraResolution;
<span style="white-space:pre">	</span>  }
  private static Point findBestPreviewSizeValue(CharSequence previewSizeValueString, Point screenResolution) {
<span style="white-space:pre">	</span>    int bestX = 0;
<span style="white-space:pre">	</span>    int bestY = 0;
<span style="white-space:pre">	</span>    int diff = Integer.MAX_VALUE;
<span style="white-space:pre">	</span>    for (String previewSize : COMMA_PATTERN.split(previewSizeValueString)) {


<span style="white-space:pre">	</span>      previewSize = previewSize.trim();
<span style="white-space:pre">	</span>      int dimPosition = previewSize.indexOf('x');
<span style="white-space:pre">	</span>      if (dimPosition < 0) {
<span style="white-space:pre">	</span>        Log.w(TAG, "Bad preview-size: " + previewSize);
<span style="white-space:pre">	</span>        continue;
<span style="white-space:pre">	</span>      }


<span style="white-space:pre">	</span>      int newX;
<span style="white-space:pre">	</span>      int newY;
<span style="white-space:pre">	</span>      try {
<span style="white-space:pre">	</span>        newX = Integer.parseInt(previewSize.substring(0, dimPosition));
<span style="white-space:pre">	</span>        newY = Integer.parseInt(previewSize.substring(dimPosition + 1));
<span style="white-space:pre">	</span>      } catch (NumberFormatException nfe) {
<span style="white-space:pre">	</span>        Log.w(TAG, "Bad preview-size: " + previewSize);
<span style="white-space:pre">	</span>        continue;
<span style="white-space:pre">	</span>      }


<span style="white-space:pre">	</span>      int newDiff = Math.abs(newX - screenResolution.x) + Math.abs(newY - screenResolution.y);
<span style="white-space:pre">	</span>      if (newDiff == 0) {
<span style="white-space:pre">	</span>        bestX = newX;
<span style="white-space:pre">	</span>        bestY = newY;
<span style="white-space:pre">	</span>        break;
<span style="white-space:pre">	</span>      } else if (newDiff < diff) {
<span style="white-space:pre">	</span>        bestX = newX;
<span style="white-space:pre">	</span>        bestY = newY;
<span style="white-space:pre">	</span>        diff = newDiff;
<span style="white-space:pre">	</span>      }


<span style="white-space:pre">	</span>    }


<span style="white-space:pre">	</span>    if (bestX > 0 && bestY > 0) {
<span style="white-space:pre">	</span>      return new Point(bestX, bestY);
<span style="white-space:pre">	</span>    }
<span style="white-space:pre">	</span>    return null;
<span style="white-space:pre">	</span>  }

setDesiredCameraParameters方法里增加camera.setDisplayOrientation(90); //此句为转为横屏时增加的

这样ZXing就可以竖屏扫描了,但是主要还有一个问题改了之后只能扫条形码不能扫二维码。这个以后还得研究

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; 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值