Android 의 QR 코드 생 성 및 검색 기능

0.머리말
오늘 이 글 은 주로 QR 코드 의 생 성과 스 캔 을 묘사 하고 현재 유행 하 는 Zxing 을 사용 합 니 다.왜 QR 코드 를 말 해 야 합 니까?QR 코드 가 너무 보편적 이기 때문에 모든 안 드 로 이 드 앱 에 QR 코드 스 캔 이 있 습 니 다.이 편 은 필요 한 학생 들 이 QR 코드 생 성과 스 캔 기능 을 신속하게 완성 하도록 돕 는 데 목적 을 둔다.
1.    Zxing 의 사용
github에서 항목 을 다운로드 하면 전체 코드 구 조 는 다음 과 같다.
这里写图片描述
저 희 는 Zxing 가방 에 있 는 모든 코드 copy 를 프로젝트 에 보 내 면 됩 니 다.이 외 에 도 Zxing 의 jar 가방 이 필요 합 니 다.마지막 으로 해당 하 는 자원 파일 은 values 파일 에 있 는 ids 파일,raw 파일 에 있 는 자원 파일(교체 가능),layot 파일 에 있 는 activity 를 포함 합 니 다.capture.xml(해당 하 는 주문 제작 가능)과 이미지 자원. 
2.    QR 코드 생 성 실현
위의 작업 이 모두 준비 되면 우리 의 QR 코드 를 만 들 수 있 습 니 다.어떻게 QR 코드 를 생 성 합 니까?
인 코딩 Utils 라 는 QR 코드 생 성 도구 클래스 가 필요 합 니 다.도구 클래스 의 createQRcode()방법 을 호출 하여 QR 코드 를 생 성 합 니 다.이 방법의 매개 변 수 는 다음 과 같다.

/* 
* content:      
* widthPix:      
* heightPix:      
* logoBm:      logo   Bitmap 
*/ 
public static Bitmap createQRCode(String content, int widthPix, int heightPix, Bitmap logoBm)
다음은 생 성 된 바 이 두 주소 의 QR 코드 이 며,중간 로고 는 안 드 로 이 드 로봇 이다.QR 코드 의 로 컬 읽 기 기능 을 추가 로 테스트 할 수 있 도록 그림 을 로 컬 에 저장 합 니 다.

/** 
 *   、       bitmap      
 */ 
 private void create() { 
 int width = DensityUtil.dip2px(this, 200); 
 Bitmap bitmap = EncodingUtils.createQRCode("http://www.baidu.com", 
  width, width, BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher)); 
 iv_zxing.setImageBitmap(bitmap); 
 saveBitmap(bitmap); 
 } 
 /** 
 *  Bitmap      
 * 
 * @param bitmap 
 */ 
 public void saveBitmap(Bitmap bitmap) { 
 //        
 File appDir = new File(Environment.getExternalStorageDirectory(),"zxing_image"); 
 if (!appDir.exists()) { 
  appDir.mkdir(); 
 } 
 String fileName = "zxing_image" + ".jpg"; 
 File file = new File(appDir, fileName); 
 try { 
  FileOutputStream fos = new FileOutputStream(file); 
  bitmap.compress(CompressFormat.JPEG, 100, fos); 
  fos.flush(); 
  fos.close(); 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } 
 //            
 try { 
  MediaStore.Images.Media.insertImage(this.getContentResolver(),file.getAbsolutePath(), fileName, null); 
 } catch (FileNotFoundException e) { 
  e.printStackTrace(); 
 } 
 //        
 sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, 
  Uri.parse("file://" + "/sdcard/namecard/"))); 
} 
다음 효과 보기:
这里写图片描述
3.    QR 코드 읽 기 실현
3.1  카메라 스 캔 방식
QR 코드 스 캔 은 Capture Activity 라 는 종 류 를 빌려 Capture Activity 인터페이스 를 열 고 스 캔 을 해 야 합 니 다.스 캔 이 끝 난 후에 onActivity Result()방법 으로 onActivity Result()에서 스 캔 한 결 과 를 얻 을 수 있 습 니 다.효 과 는 시 뮬 레이 터 를 사용 하기 때문에 보 여주 지 않 습 니 다.자세 한 코드 는 다음 과 같 습 니 다.

 /** 
 *         
 */ 
private void open() { 
 config(); 
 startActivityForResult(new Intent(MainActivity.this,CaptureActivity.class), 0); 
} 
/** 
 *        
 */ 
private void config() { 
 WindowManager.LayoutParams lp = getWindow().getAttributes(); 
 lp.screenBrightness = 1.0f; 
 getWindow().setAttributes(lp); 
} 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
 super.onActivityResult(requestCode, resultCode, data); 
 if (resultCode == RESULT_OK) { 
 Bundle bundle = data.getExtras(); 
 String result = bundle.getString("result"); 
 tv_result.setText(result); 
 } 
3.2  로 컬 그림 스 캔 방식
로 컬 그림 을 스 캔 하려 면 Capture Activity 에서 해당 하 는 수정 이 필요 합 니 다.이 를 위해 저 는 스 캔 인터페이스 밑 에 단 추 를 추가 하여 로 컬 그림 을 선택 하 였 습 니 다.layot 코드 는 여기 서 보 여주 지 않 습 니 다.클릭 한 이벤트 처 리 를 직접 보 겠 습 니 다.

/** 
*        
*/ 
private void openLocalImage() { 
 //          
 Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); 
 innerIntent.setType("image/*"); 
 Intent wrapperIntent = Intent.createChooser(innerIntent, "       "); 
 this.startActivityForResult(wrapperIntent, 0x01); 
} 
시스템 갤러리 를 열 고 그림 을 선택 하려 면 onActivity Result()방법 을 다시 써 서 그림 정 보 를 되 돌려 야 합 니 다.

@Override 
 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
 super.onActivityResult(requestCode, resultCode, data); 
 if (resultCode == RESULT_OK) { 
  switch (requestCode) { 
  case 0x01: 
  //           
  Cursor cursor = getContentResolver().query(data.getData(),null, null, null, null); 
  if (cursor.moveToFirst()) { 
   photo_path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); 
  } 
  cursor.close(); 
  new Thread(new Runnable() { 
   @Override 
   public void run() { 
   Result result = scanningImage(photo_path); 
   if (result != null) { 
    handleDecode(result, new Bundle()); 
   } 
   } 
  }).start(); 
  break; 
  } 
 } 
} 
이미지 획득 경로 photopath 후 scanning Image()방법 으로 스 캔 을 진행 합 니 다.Zxing 소스 코드 에서 스 캔 한 결 과 는 Result 결과 에 집중 되 어 있 습 니 다.Result 를 받 으 면 결 과 를 되 돌려 주 고 Capture Activity 소스 코드 를 읽 으 면 마지막 Result 결과 집 회 를 handle Decode()에 전달 하 는 방법 을 알 수 있 습 니 다.

/** 
 * A valid barcode has been found, so give an indication of success and show 
 * the results. 
 * 
 * @param rawResult 
 *  The contents of the barcode. 
 * @param bundle 
 *  The extras 
 */ 
 public void handleDecode(Result rawResult, Bundle bundle) { 
 inactivityTimer.onActivity(); 
 beepManager.playBeepSoundAndVibrate(); 
 Intent resultIntent = new Intent(); 
 bundle.putInt("width", mCropRect.width()); 
 bundle.putInt("height", mCropRect.height()); 
 bundle.putString("result", rawResult.getText()); 
 resultIntent.putExtras(bundle); 
 this.setResult(RESULT_OK, resultIntent); 
 CaptureActivity.this.finish(); 
}
그림 경 로 를 가 져 온 후 QR 코드 정 보 를 Result 대상 으로 포장 해 야 하기 때문에 그림 을 분석 해 야 합 니 다.

/** 
 *            
 * 
 * @param path 
 * @return 
 */ 
 public Result scanningImage(String path) { 
 if (TextUtils.isEmpty(path)) { 
  return null; 
 } 
 Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>(); 
 hints.put(DecodeHintType.CHARACTER_SET, "UTF8"); //            
 BitmapFactory.Options options = new BitmapFactory.Options(); 
 options.inJustDecodeBounds = true; //        
 scanBitmap = BitmapFactory.decodeFile(path, options); 
 options.inJustDecodeBounds = false; //        
 int sampleSize = (int) (options.outHeight / (float) 200); 
 if (sampleSize <= 0) 
  sampleSize = 1; 
 options.inSampleSize = sampleSize; 
 scanBitmap = BitmapFactory.decodeFile(path, options); 
 int width = scanBitmap.getWidth(); 
 int height = scanBitmap.getHeight(); 
 int[] pixels = new int[width * height]; 
 scanBitmap.getPixels(pixels, 0, width, 0, 0, width, height); 
 /** 
 *             
 */ 
 RGBLuminanceSource source = new RGBLuminanceSource(width, height, 
  pixels); 
 BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source)); 
 QRCodeReader reader = new QRCodeReader(); 
 try { 
  return reader.decode(bitmap1, hints); 
 } catch (NotFoundException e) { 
  e.printStackTrace(); 
 } catch (ChecksumException e) { 
  e.printStackTrace(); 
 } catch (FormatException e) { 
  e.printStackTrace(); 
 } 
 return null; 
 } 
경로 에 따라 Bitmap 를 가 져 오고 마지막 으로 QRcodeReader 의 decode 방법 을 통 해 Result 대상 으로 분석 하고 되 돌려 주 며 handleDecode 방법 에 전 달 됩 니 다.프로그램 실행 효 과 는 다음 과 같 습 니 다.이전에 정 의 된 바 이 두 주 소 를 검색 합 니 다.
这里写图片描述
마지막 으로 설명 권한 과 Capture Activity 를 잊 지 마 세 요.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 
<uses-permission android:name="android.permission.CAMERA"/> 
<uses-permission android:name="android.permission.VIBRATE"/> 
<activity android:name="com.example.zxingtest.zxing.activity.CaptureActivity"/> 
여러분 은 이 문장 을 참고 하 실 수 있 습 니 다.Android QR 코드 스 캔 및 생 성 을 위 한 간단 한 방법
위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 안 드 로 이 드 의 QR 코드 생 성과 스 캔 기능 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기