Android 의 QR 코드 생 성 및 검색 기능
오늘 이 글 은 주로 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 코드 생 성과 스 캔 기능 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.