好久沒上csdn了, 在這裏特別想念大家, 最近公司一段時間忙吧,無暇東顧。掃噶,還是直接進入主題吧
大家都知道 直接從google down下來的 zxing二維碼掃描 是 在掃描界面 中間的紅線是 豎着的 ,那麼怎麼能讓它 橫着 顯示呢, 只 因簡單幾步,輕鬆搞定
首先講下關鍵的幾個類
CaptureActivity。這個是啓動Activity 也就是掃描器(如果是第一安裝,它還會跳轉到幫助界面)。
CaptureActivityHandler 解碼處理類,負責調用另外的線程進行解碼。
DecodeThread 解碼的線程。
com.google.zxing.client.android.camera 包,攝像頭控制包。
ViewfinderView 自定義的View,就是我們看見的拍攝時中間的框框了
一 點開 com.google.zxing.client.android包下在DecodeHandler.java中,修改decode方法 在decode 方法中 修改 代碼
PlanarYUVLuminanceSource source = CameraManager.get().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; // Here we are swapping, that's the difference to #11
width = height;
height = tmp;
PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(rotatedData, width, height);
/**
* 修改結束
*/
二 點開包com.google.zxing.client.android.camera 下 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;
三 順便在 還在這個包中的 CameraConfigurationManager 類中的setDesiredCameraParameters方法中添加一句
第一、 void setDesiredCameraParameters(Camera camera) {
Camera.Parameters parameters = camera.getParameters();
Log.d(TAG, "Setting preview size: " + cameraResolution);
parameters.setPreviewSize(cameraResolution.x, cameraResolution.y);
setFlash(parameters);
setZoom(parameters);
camera.setParameters(parameters);
//camera.setDisplayOrientation(90);// 框框中改橫線是 修改的 , 這行代碼就可以註釋了, 就不用了, 如果用這行代碼 則會出現 極光線變成橫線的時候 圖像有拉伸的功能了
// 使攝像頭旋轉90度
setDisplayOrientation(camera, 90);
}
添加 setDisplayOrientation(camera, 90);這個方法.
/*改變照相機成像的方向的方法*/
protected void setDisplayOrientation(Camera camera, int angle) {
Method downPolymorphic = null;
try {
downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });
if (downPolymorphic != null)
downPolymorphic.invoke(camera, new Object[]{angle});
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
第二、
在 這個類中 的這個方法 void initFromCameraParameters(Camera camera) { 裏面 在
Log.d(TAG, "Screen resolution: " + screenResolution);
下面添加如下代碼
//爲豎屏添加
Point screenResolutionForCamera = new Point();
screenResolutionForCamera.x = screenResolution.x;
screenResolutionForCamera.y = screenResolution.y;
if (screenResolution.x < screenResolution.y) {
screenResolutionForCamera.x = screenResolution.y;
screenResolutionForCamera.y = screenResolution.x;
}
// 下句第二參數要根據豎屏修改
cameraResolution = getCameraResolution(parameters, screenResolutionForCamera);
/*cameraResolution = getCameraResolution(parameters, screenResolution);*/ 並註釋zxing自帶的 這行代碼
四 ,在AndroidManifest.xml中,把CaptureActivity的屬性android:screenOrientation="landscape"
改爲
android:screenOrientation="portrait"
夠詳細了吧, 開發 二維碼掃描的哥們 在搞不出來, 實在不知道說什麼好了 。
但是在修改中存在一個問題, 若是 在上述第三個步驟中 加入 camera.setDisplayOrientation(90); 這句話報錯時, 給zxing換一個核心包,若是還報錯直接換個搞點版本的Android包就OK 了, 建議直接換成 高點的Android 包。
當然加入這句話不錯的哥們 就不用管啦, 唉, 爲了後人不走彎路,特別奉上。