zxing 에서 가로모드로만 되어 있는 것을 세로 모드로 바꾸어 보겠습니다.
zxing 버전은 2012년 11월 20일 ZxingDemo versionCode=87 입니다.
zxing : https://github.com/zxing/zxing

많은 블로그에서 가져와서 테스트 해본 결과 입니다.

  1. AndroidManifest.xml 에서 android:screenOrientation="portrait" 로 설정
  2. CameraConfigurationManager.java
  3.  
    	void initFromCameraParameters(Camera camera) {
    		Camera.Parameters parameters = camera.getParameters();
    		WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    		Display display = manager.getDefaultDisplay();
    		int width = display.getWidth();
    		int height = display.getHeight();
    		// We're landscape-only, and have apparently seen issues with display thinking it's portrait 
    		// when waking from sleep. If it's not landscape, assume it's mistaken and reverse them:
    		// 아래 if 문을 주석 처리를 합니다.
    //		if (width < height) {
    //			Log.i(TAG, "Display reports portrait orientation; assuming this is incorrect");
    //			int temp = width;
    //			width = height;
    //			height = temp;
    //		}
    		screenResolution = new Point(width, height);
    		Log.i(TAG, "Screen resolution: " + screenResolution);
    		cameraResolution = findBestPreviewSizeValue(parameters, screenResolution);
    		Log.i(TAG, "Camera resolution: " + cameraResolution);
    	}
    
  4. void setDesiredCameraParameters(Camera camera, boolean safeMode) 함수에서 제일 아래 부분의 
    camera.setParameters(parameters); 전에 camera.setDisplayOrientation(90); 를 추가 합니다.
  5. CameraManager.java 파일에서 getFramingRectInPreview() 에 아래와 같은 코드를 추가 합니다.
  6.  
          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;
    

     

  7. DecodeHandler.java 파일에서 private void decode(byte[] data, int width, int height) 함수에 아래와 같은 코드를 추가 합니다.
 
    byte[] portraitData = new byte[data.length];
    for (int y = 0; y < height; y++) {
    	for (int x = 0; x < width; x++) {
    		portraitData[x * height + height - y - 1] = data[x + y * width];
    	}
	}
	int tmp = width;
	width = height;
	height = tmp;
  	// 회전한 데이터를 buildLuminanceSource 에서 사용 해야 함
  	PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(portraitData, width, height);
    간단한 QR Code 생성은 다음에 작성하도록 하겠습니다.
    Posted by outliers
    ,