Android, 내 애플리케이션에서 QR 코드를 읽는 방법은 무엇입니까?
내 응용 프로그램에서 Qr 코드를 읽어야합니다. 나는 인터넷을 검색하고 Zing 코드를 찾았지만 많은 개발자가 그것을 사용하는 데 문제가 있었고 버그가있는 것 같습니다!
내 고객이 기기에 qr 리더를 설치했다고 가정하는 경우 이러한 애플리케이션을 어떻게 사용하고 암시 적 의도를 통해 호출 할 수 있습니까?
사용자에게 qr 리더가 없으면 응용 프로그램은 어떻게됩니까? 충돌이 발생하면 사용자에게 예를 들어 QrDroid를 다운로드하고 그 후에 사용하도록 요청할 수 있습니까?
try {
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); // "PRODUCT_MODE for bar codes
startActivityForResult(intent, 0);
} catch (Exception e) {
Uri marketUri = Uri.parse("market://details?id=com.google.zxing.client.android");
Intent marketIntent = new Intent(Intent.ACTION_VIEW,marketUri);
startActivity(marketIntent);
}
그리고 onActivityResult():
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = data.getStringExtra("SCAN_RESULT");
}
if(resultCode == RESULT_CANCELED){
//handle cancel
}
}
}
Zxing은 Qr 코드 스캔 및 생성을 수행하는 훌륭한 라이브러리입니다. 다음 구현은 Zxing 라이브러리를 사용하여 QR 코드 이미지를 스캔합니다. build.gradle에 다음 종속성을 추가하는 것을 잊지 마십시오.
compile 'me.dm7.barcodescanner:zxing:1.9'
코드 스캐너 활동 :
public class QrCodeScanner extends AppCompatActivity implements ZXingScannerView.ResultHandler {
private ZXingScannerView mScannerView;
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
// Programmatically initialize the scanner view
mScannerView = new ZXingScannerView(this);
// Set the scanner view as the content view
setContentView(mScannerView);
}
@Override
public void onResume() {
super.onResume();
// Register ourselves as a handler for scan results.
mScannerView.setResultHandler(this);
// Start camera on resume
mScannerView.startCamera();
}
@Override
public void onPause() {
super.onPause();
// Stop camera on pause
mScannerView.stopCamera();
}
@Override
public void handleResult(Result rawResult) {
// Do something with the result here
// Prints scan results
Logger.verbose("result", rawResult.getText());
// Prints the scan format (qrcode, pdf417 etc.)
Logger.verbose("result", rawResult.getBarcodeFormat().toString());
//If you would like to resume scanning, call this method below:
//mScannerView.resumeCameraPreview(this);
Intent intent = new Intent();
intent.putExtra(AppConstants.KEY_QR_CODE, rawResult.getText());
setResult(RESULT_OK, intent);
finish();
}
}
사용자에게 qr 리더가 없으면 응용 프로그램은 어떻게됩니까? 충돌이 발생하면 사용자에게 예를 들어 QrDroid를 다운로드하고 그 후에 사용하도록 요청할 수 있습니까?
흥미롭게도 Google은 이제 Mobile Vision API를 도입 했으며 이는 Play 서비스 자체에 통합되었습니다.
Gradle 파일에 다음을 추가하십시오.
compile 'com.google.android.gms:play-services-vision:11.4.0'
이 QR 코드 자습서 에서 가져 왔습니다 .
안드로이드 스튜디오에서는 아래와 같이 QR 코드를 생성하고 읽을 수 있습니다.
- Android Studio 빈 프로젝트 만들기
app.gradle에 라이브러리 추가
compile 'com.google.zxing:core:3.2.1' compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar'
activity.main xml에서 다음을 사용하십시오.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.enamul.qrcode.MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="20dp" android:orientation="vertical"> <EditText android:id="@+id/editText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:hint="Enter Text Here" /> <Button android:id="@+id/button" android:layout_width="fill_parent" android:layout_height="50dp" android:layout_below="@+id/editText" android:text="Click Here TO generate qr code" android:textAllCaps="false" android:textSize="16sp" /> <Button android:id="@+id/btnScan" android:layout_width="fill_parent" android:layout_height="50dp" android:layout_below="@+id/editText" android:text="Scan Your QR Code" android:textAllCaps="false" android:textSize="16sp" /> <TextView android:id="@+id/tv_qr_readTxt" android:layout_width="match_parent" android:layout_height="wrap_content" /> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="200dp" android:layout_below="@+id/button" android:src="@android:drawable/ic_dialog_email" /> </LinearLayout> </LinearLayout>
MainActivity에서 다음 코드를 사용할 수 있습니다.
public class MainActivity extends AppCompatActivity { ImageView imageView; Button button; Button btnScan; EditText editText; String EditTextValue ; Thread thread ; public final static int QRcodeWidth = 350 ; Bitmap bitmap ; TextView tv_qr_readTxt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView)findViewById(R.id.imageView); editText = (EditText)findViewById(R.id.editText); button = (Button)findViewById(R.id.button); btnScan = (Button)findViewById(R.id.btnScan); tv_qr_readTxt = (TextView) findViewById(R.id.tv_qr_readTxt); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(!editText.getText().toString().isEmpty()){ EditTextValue = editText.getText().toString(); try { bitmap = TextToImageEncode(EditTextValue); imageView.setImageBitmap(bitmap); } catch (WriterException e) { e.printStackTrace(); } } else{ editText.requestFocus(); Toast.makeText(MainActivity.this, "Please Enter Your Scanned Test" , Toast.LENGTH_LONG).show(); } } }); btnScan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { IntentIntegrator integrator = new IntentIntegrator(MainActivity.this); integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES); integrator.setPrompt("Scan"); integrator.setCameraId(0); integrator.setBeepEnabled(false); integrator.setBarcodeImageEnabled(false); integrator.initiateScan(); } }); } Bitmap TextToImageEncode(String Value) throws WriterException { BitMatrix bitMatrix; try { bitMatrix = new MultiFormatWriter().encode( Value, BarcodeFormat.DATA_MATRIX.QR_CODE, QRcodeWidth, QRcodeWidth, null ); } catch (IllegalArgumentException Illegalargumentexception) { return null; } int bitMatrixWidth = bitMatrix.getWidth(); int bitMatrixHeight = bitMatrix.getHeight(); int[] pixels = new int[bitMatrixWidth * bitMatrixHeight]; for (int y = 0; y < bitMatrixHeight; y++) { int offset = y * bitMatrixWidth; for (int x = 0; x < bitMatrixWidth; x++) { pixels[offset + x] = bitMatrix.get(x, y) ? getResources().getColor(R.color.QRCodeBlackColor):getResources().getColor(R.color.QRCodeWhiteColor); } } Bitmap bitmap = Bitmap.createBitmap(bitMatrixWidth, bitMatrixHeight, Bitmap.Config.ARGB_4444); bitmap.setPixels(pixels, 0, 350, 0, 0, bitMatrixWidth, bitMatrixHeight); return bitmap; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); if(result != null) { if(result.getContents() == null) { Log.e("Scan*******", "Cancelled scan"); } else { Log.e("Scan", "Scanned"); tv_qr_readTxt.setText(result.getContents()); Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show(); } } else { // This is important, otherwise the result will not be passed to the fragment super.onActivityResult(requestCode, resultCode, data); } } }
GitHub에서 전체 소스 코드를 다운로드 할 수 있습니다. GitHub 링크 : https://github.com/enamul95/QRCode
간단한 예제 튜토리얼을 만들었습니다. 이것을 읽고 응용 프로그램에서 사용할 수 있습니다.
http://ribinsandroidhelper.blogspot.in/2013/03/qr-code-reading-on-your-application.html
이 링크를 통해 qrcode 라이브러리 프로젝트를 다운로드하고 작업 공간으로 가져오고 프로젝트에 라이브러리를 추가 할 수 있습니다.
이 코드를 활동에 복사하십시오.
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
startActivityForResult(intent, 0);
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = intent.getStringExtra("SCAN_RESULT");
String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
Toast.makeText(this, contents,Toast.LENGTH_LONG).show();
// Handle successful scan
} else if (resultCode == RESULT_CANCELED) {
//Handle cancel
}
}
}
ZXing과 같은 QR 라이브러리를 사용하십시오 ... 저는 그것에 대해 아주 좋은 경험을했습니다. QrDroid는 훨씬 버그가 많습니다. 외부 리더에 의존해야하는 경우 Google 고글과 같은 표준 리더를 사용하세요!
간편한 QR 코드 라이브러리
간단한 Android Easy QR 코드 라이브러리. 이 라이브러리를 사용하려면 다음 단계를 따르십시오.
Gradle의 경우 :
1 단계. 저장소 끝에있는 루트 build.gradle에 추가합니다.
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
2 단계. 종속성 추가 :
dependencies {
compile 'com.github.mrasif:easyqrlibrary:v1.0.0'
}
Maven의 경우 :
1 단계. 빌드 파일에 JitPack 저장소를 추가합니다.
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
2 단계. 종속성 추가 :
<dependency>
<groupId>com.github.mrasif</groupId>
<artifactId>easyqrlibrary</artifactId>
<version>v1.0.0</version>
</dependency>
SBT의 경우 :
1 단계. build.sbt 파일에 JitPack 저장소를 추가합니다.
resolvers += "jitpack" at "https://jitpack.io"
2 단계. 종속성 추가 :
libraryDependencies += "com.github.mrasif" % "easyqrlibrary" % "v1.0.0"
Leiningen의 경우 :
1 단계. 저장소 끝에있는 project.clj에 추가합니다.
:repositories [["jitpack" "https://jitpack.io"]]
2 단계. 종속성 추가 :
:dependencies [[com.github.mrasif/easyqrlibrary "v1.0.0"]]
레이아웃 xml 파일에 다음을 추가하십시오.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp"
tools:context=".MainActivity"
android:orientation="vertical">
<TextView
android:id="@+id/tvData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="No QR Data"/>
<Button
android:id="@+id/btnQRScan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="QR Scan"/>
</LinearLayout>
활동 Java 파일에 다음을 추가하십시오.
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
TextView tvData;
Button btnQRScan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvData=findViewById(R.id.tvData);
btnQRScan=findViewById(R.id.btnQRScan);
btnQRScan.setOnClickListener(this);
}
@Override
public void onClick(View view){
switch (view.getId()){
case R.id.btnQRScan: {
Intent intent=new Intent(MainActivity.this, QRScanner.class);
startActivityForResult(intent, EasyQR.QR_SCANNER_REQUEST);
} break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case EasyQR.QR_SCANNER_REQUEST: {
if (resultCode==RESULT_OK){
tvData.setText(data.getStringExtra(EasyQR.DATA));
}
} break;
}
}
}
사용자 정의 된 스캐너 화면의 경우 스캐너 작업을 시작할 때이 줄을 추가하십시오.
Intent intent=new Intent(MainActivity.this, QRScanner.class);
intent.putExtra(EasyQR.IS_TOOLBAR_SHOW,true);
intent.putExtra(EasyQR.TOOLBAR_DRAWABLE_ID,R.drawable.ic_audiotrack_dark);
intent.putExtra(EasyQR.TOOLBAR_TEXT,"My QR");
intent.putExtra(EasyQR.TOOLBAR_BACKGROUND_COLOR,"#0588EE");
intent.putExtra(EasyQR.TOOLBAR_TEXT_COLOR,"#FFFFFF");
intent.putExtra(EasyQR.BACKGROUND_COLOR,"#000000");
intent.putExtra(EasyQR.CAMERA_MARGIN_LEFT,50);
intent.putExtra(EasyQR.CAMERA_MARGIN_TOP,50);
intent.putExtra(EasyQR.CAMERA_MARGIN_RIGHT,50);
intent.putExtra(EasyQR.CAMERA_MARGIN_BOTTOM,50);
startActivityForResult(intent, EasyQR.QR_SCANNER_REQUEST);
완료되었습니다. Ref. 링크 : https://mrasif.github.io/easyqrlibrary
참조 URL : https://stackoverflow.com/questions/8831050/android-how-to-read-qr-code-in-my-application
'program tip' 카테고리의 다른 글
Git 저장소 Gitolite를 삭제 하시겠습니까? (0) | 2020.12.15 |
---|---|
PHP를 사용하여 MySQL 데이터베이스에 저장하는 IP 주소 (0) | 2020.12.15 |
가비지 수집기 및 순환 참조 (0) | 2020.12.15 |
메모장 ++에서 현재 줄을 삭제하고 새 줄을 추가하는 방법은 무엇입니까? (0) | 2020.12.15 |
사용자 지정 .php 파일에 WordPress 기능을 포함하는 방법은 무엇입니까? (0) | 2020.12.15 |