zxing 바코드, 큐알스케너
#가로모드에서 세로모드로 변경하기
위 화면을 보시면 가로로 바코드나 큐알을 스캔할 수 있도록 되어 있어요
landscape = > portrait로 변경해주는 방법
토탈 네차례 정도의 단계를 거쳐주셔야 세로로 스켄을 할 수 있도록 변경이 돼요
=====
첫째. 메니페스트(AndroidManifest.xml) 에 있는다음의 구문의 정보를 수정하세요~
<uses-feature android:name="android.hardware.screen.landscape"/>
부분을 <uses-feature android:name="android.hardware.screen.portrait"/>로 변경해주세요~
AndroidManifest.xml의 소스중 액티비티(CaptureActivity) 의 screen orientation을 portrait으로 변경해주세요~
CameraManager 클래스의 openDriver() 함수로 가셔서 theCamera = Camera.open(); 구문의 아래쪽에 theCamera.setDisplayOrientation(90); 을 추가시켜주세요
=====
둘째. 카메라와 액티비티를 세로모드로 전환하셨어도 사진을 통해 찍힌 이미지가 여전히 가로로 나오게 돼요
사진을 찍은 후 얻은 byte[] data를 세로로 전환시켜주게 돼요
DecodeHandler.java 파일을 열어보시면
activity.getCameraManager().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;
width = height;
height = tmp;
byte[]data를 회전하여 rotatedData에 저장하고 width와 height를 스왑해주게 돼요
그 다음에
buildLuminanceSource(rotatedData, width, height); 와 같이 바뀐 인자값을 넣어주세요~
=====
셋째. CameraManager.java 파일을 열어 보세요~
getFramingRectInPreview()의 rect 와 관련된 부분의 소스를 다음과 같이 바꾸어주세요
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의 getCameraResolution()과 getScreenResolution()의 소스를 다음과 같이 수정해주세요~
Point getCameraResolution() {
int tmp = cameraResolution.x;
cameraResolution.x = cameraResolution.y;
cameraResolution.y = tmp;
return cameraResolution;
}
Point getScreenResolution() {
int tmp = screenResolution.x;
screenResolution.x = screenResolution.y;
screenResolution.y = tmp;
return screenResolution;
}
**** 중요한 부분
그런데 이렇게 해서 만약에 에러가 발생한다면 그 소스를 치환보다 그대로 두세요~
*****
추가적인 부분들
1. CameraConfigurationManager 클래스에 setDesiredCameraParameters() 메소드에
Camera.Parameters parameters = camera.getParameters(); 소스 구문이 존재해요
그 소스의 아래쪽 부분에 다음의 소스를 추가해주세요~
parameters.set("orientation", "portrait");
2. PlanarYUVLuminanceSource 클래스의 다음 구문을 검색하셔서 다음 소스구문들을 모두 주석처리 해주세요~
if (left + width > dataWidth || top + height > dataHeight) {
throw new IllegalArgumentException("Crop rectangle does not fit within image
data.");
}
테스트를 해보시면 정상적으로 동작을 하게 돼요
가로는 해외 분들은 편할 수 있으나 지인들은 가로로 어플을 사용하는데 익숙해져 있어서 바코드스캐너, 큐알스캐너를 사용하는데는 세로방식을 편리해해요
barcode scanner, qr scanner 편리하게 만들어야 유저분들이 많이 사용하게 돼요
----------
강좌소개