Dans mon application, je dois lire le code Qr. J'ai cherché sur Internet et trouvé des codes Zing, mais beaucoup de développeurs ont eu du mal à l'utiliser et il semble que ce soit un buggy!
Si je suppose que qr reader est installé sur mes appareils, comment puis-je utiliser ces applications et les appeler via des intentions implicites?
si l'utilisateur n'a pas de lecteur QR, qu'adviendra-t-il de l'application? S'il se bloque, puis-je demander à l'utilisateur de télécharger par exemple QrDroid et de l'utiliser ensuite?
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);
}
et dans 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 est une excellente bibliothèque pour scanner et générer du code Qr. L’implémentation suivante utilise la bibliothèque Zxing pour analyser l’image de code QR. Ne pas oublier d’ajouter la dépendance suivante dans le fichier build.gradle.
compile 'me.dm7.barcodescanner:zxing:1.9'
Activité du scanner de code:
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();
}
}
si l'utilisateur n'a pas de lecteur QR, qu'adviendra-t-il de l'application? S'il se bloque, puis-je demander à l'utilisateur de télécharger par exemple QrDroid et de l'utiliser ensuite?
Fait intéressant, Google a maintenant introduit API Mobile Vision , elles sont intégrées aux services de jeu eux-mêmes.
Dans votre fichier Gradle, ajoutez simplement:
compile 'com.google.Android.gms:play-services-vision:11.4.0'
Tiré de ceci tutoriel de code QR .
Dans Android studio, vous pouvez utiliser le processus ci-dessous pour créer & lire un code QR & une image ressemblant à un bellw
Ajouter une bibliothèque dans app.gradle
compile 'com.google.zxing:core:3.2.1'
compile 'com.journeyapps:zxing-Android-embedded:3.2.0@aar'
Dans activity.main, utilisez ci-dessous.
<?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>
Dans MainActivity, vous pouvez utiliser le code ci-dessous.
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);
}
}
}
Vous pouvez télécharger le code source complet depuis GitHub. Le lien GitHub est: https://github.com/enamul95/QRCode
J'ai créé un exemple de tutoriel simple. Vous pouvez lire ceci et l'utiliser dans votre application.
http://ribinsandroidhelper.blogspot.in/2013/03/qr-code-reading-on-your-application.html
Grâce à ce lien, vous pouvez télécharger le projet de bibliothèque qrcode, l'importer dans votre espace de travail et l'ajouter à votre projet.
et copiez ce code dans votre activité
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
}
}
}
Utilisez une bibliothèque QR comme ZXing ... J'ai eu une très bonne expérience, QrDroid est beaucoup plus buggier. Si vous devez utiliser un lecteur externe, utilisez un lecteur standard tel que Google Goggles!
Un simple Android Bibliothèque de codes QR facile. Il est très facile à utiliser. Pour utiliser cette bibliothèque, suivez ces étapes.
Étape 1. Ajoutez-le dans votre build.gradle racine à la fin des référentiels:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Étape 2. Ajoutez la dépendance:
dependencies {
compile 'com.github.mrasif:easyqrlibrary:v1.0.0'
}
Étape 1. Ajoutez le référentiel JitPack à votre fichier de construction:
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
Étape 2. Ajoutez la dépendance:
<dependency>
<groupId>com.github.mrasif</groupId>
<artifactId>easyqrlibrary</artifactId>
<version>v1.0.0</version>
</dependency>
Étape 1. Ajoutez le référentiel JitPack à votre fichier build.sbt:
resolvers += "jitpack" at "https://jitpack.io"
Étape 2. Ajoutez la dépendance:
libraryDependencies += "com.github.mrasif" % "easyqrlibrary" % "v1.0.0"
Étape 1. Ajoutez-le dans votre projet.clj à la fin des référentiels:
:repositories [["jitpack" "https://jitpack.io"]]
Étape 2. Ajoutez la dépendance:
:dependencies [[com.github.mrasif/easyqrlibrary "v1.0.0"]]
<?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>
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;
}
}
}
Pour un écran de scanner personnalisé, ajoutez simplement ces lignes lorsque vous démarrez l’activité du scanner.
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);
Vous avez terminé. Réf. Lien: https://mrasif.github.io/easyqrlibrary