2016년 1월 30일 토요일

zxing 바코드, 큐알스케너#가로모드에서 세로모드로 변경하기




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 편리하게 만들어야 유저분들이  많이 사용하게 돼요


----------
강좌소개

안드로이드 강좌 - 서울 (셋팅 + 하이브리드어플)



댓글 없음:

댓글 쓰기