Android

[zxing라이브러리] EAN_13 타입 오류 java.lang.IllegalArgumentException: Requested contents should be 12 or 13 digits long, but got 48

구글에서 제공하는 zxing라이브러리를 가지고 바코드 스캔앱을 만들어보는 중인데 오류가 발생하였다. ISBN 바코드를 읽어 들인 후 비트맵으로 처리하는 과정에 발생된 오류로 오류내용은 java.lang.IllegalArgumentException:Requested contents should be 12 or 13 digits long, but got 48 이다. 바코드 타입이 EAN_13인 바코드를 스캔하면 발생되었다. ISBN바코드는 EAN_13 형식이다. 오류가 발생한 코드는 다음과 같다.

Bitmap bitmap = null;
try {
	if (result.getResultMetadata() != null) {
		bitmap = getBitMapFromMetadata(result.getResultMetadata().toString()
        	, result.getBarcodeFormat());
	}
}catch (Exception e){

}
    public Bitmap getBitMapFromMetadata(String data, BarcodeFormat foramt){
        Bitmap mBitmap = null; 
        com.google.zxing.Writer wr = new MultiFormatWriter();
        try {
         
            int width = 350;
            int height = 350;
            BitMatrix bm = wr.encode(data, foramt, width, height);
            mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

            for (int i = 0; i < width; i++) {
                for (int j = 0; j < height; j++) {
                    mBitmap.setPixel(i, j, bm.get(i, j) ? Color.BLACK : Color.WHITE);
                }
            }
        } catch (WriterException e) {
            mBitmap = null;
            //e.printStackTrace();
        }
        return mBitmap;
    }

 

바코드를 처리하는 클래스 중에 EAN 타입의 바코드를 처리하는 com.google.zxing.oned 패키지의 EAN13Writer.class파일을 열어보았다. 결국 문자열데이터의 길이가 12이거나 13이어야하는데 48이 넘어와서 오류가 발생되었다는 얘기이다. 무슨 버그인것인가??

  @Override
  public boolean[] encode(String contents) {
    int length = contents.length();
    switch (length) {
      case 12:
        // No check digit present, calculate it and add it
        int check;
        try {
          check = UPCEANReader.getStandardUPCEANChecksum(contents);
        } catch (FormatException fe) {
          throw new IllegalArgumentException(fe);
        }
        contents += check;
        break;
      case 13:
        try {
          if (!UPCEANReader.checkStandardUPCEANChecksum(contents)) {
            throw new IllegalArgumentException("Contents do not pass checksum");
          }
        } catch (FormatException ignored) {
          throw new IllegalArgumentException("Illegal contents");
        }
        break;
      default:
        throw new IllegalArgumentException(
            "Requested contents should be 12 or 13 digits long, but got " + length);
    }

 

[처리방법]

바코드를 인코딩 처리시 바코드의 가로 세로의 높이값을 기존에 350에서 300으로 변경 후 재빌드하여 앱을 테스트 하였더니 정상적으로 오류발생없이 지나갔다. 인코딩하는 과정에 가로 세로 높이가 문제가 되는 것일까? EAN13Writer.class파일을 열어서 확인한 결과 0보다 작은 경우에만 오류처리가 되고 있었다. 그렇다면 문제가 없다는 것인가??

    if (width < 0 || height < 0) {
      throw new IllegalArgumentException("Negative size is not allowed. Input: "
                                             + width + 'x' + height);
    }
    public Bitmap getBitMapFromMetadata(String data, BarcodeFormat foramt){
        Bitmap mBitmap = null; 
        com.google.zxing.Writer wr = new MultiFormatWriter();
        try {
         
            int width = 300;
            int height = 300;
            BitMatrix bm = wr.encode(data, foramt, width, height);
            mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

            for (int i = 0; i < width; i++) {
                for (int j = 0; j < height; j++) {
                    mBitmap.setPixel(i, j, bm.get(i, j) ? Color.BLACK : Color.WHITE);
                }
            }
        } catch (WriterException e) {
            mBitmap = null;
            //e.printStackTrace();
        }
        return mBitmap;
    }

혹시나 해서 다시 width=350, height =350으로 변경 후 재빌드 후 앱을 테스트하였다. 그런데 이게 무슨일인가??? 발생하던 오류가 사라졌다. 오류가 발생하지 않는 것이다. 무엇이 문제였을까?? 혹시나 동일하게 이와 같은 오류가 발생한다면 인코딩시 가로 세로 높이를 변경해보면 도움이 되지않을까하는 생각으로 기록을 남긴다. 확실한 해결책인지는 모르겠다. 다시 오류가 발생된다면 다시 확인해보자.

 

 

[REFERENCE]

stackoverflow.com/questions/22766017/datamatrix-encoding-with-zxing-only-generates-14px-bitmap

stackoverflow.com/questions/24408954/zxing-ean13-barcode-encoding-with-lead-separator-and-trailer

 

Leave a Reply

error: Content is protected !!