I have seen solutions on web but there isn't a completed one.Here is how I put the solutions into a piece and make it works.
Step1: Add following lines to rotate data before buildLuminanceSource(..) in decode(byte[] data,int width, int height)
DecodeHandler.java:
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;
PlanarYUVLuminanceSourcesource = activity.getCameraManager().buildLuminanceSource(rotatedData, width,height);
Step2: Modify getFramingRectInPreview().
CameraManager.java
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;
Step3: Disable the check for Landscape Mode in initFromCameraParameters(...)
CameraConfigurationManager.java
//remove thefollowing
if (width <height) {
Log.i(TAG, "Display reports portraitorientation; assuming this is incorrect");
int temp = width;
width = height;
height = temp;
}
Step4: Add following line to rotate camera insetDesiredCameraParameters(...)
CameraConfigurationManager.java
camera.setDisplayOrientation(90);
Step5: Do not forget to set orientation of activity to portrait. I.e: manifest
5.在CameraConfigurationManager中的initFromCameraParameters()方法的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);
如果想把摄像头的取景框长宽设成一样(感觉取景框有点小的话),可以进行如下修改
把在CameraManager.java的getFramingRect方法中把
framingRect= new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);
替换成
framingRect= new Rect(leftOffset, topOffset, leftOffset + width, topOffset + width);