现在网上的修改方法很多,但是好像都跟我下载的源码对不起来,我按这里的源码对我下载的版本进行了修改
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;
针对网上修改方法与实际源码不符的问题,本文详细介绍了根据当前ZXing源码进行竖屏扫描的修改操作,包括添加权限等关键步骤。

8889

被折叠的 条评论
为什么被折叠?



