2012-01-12 22 views
36

En mi aplicación necesito leer el código Qr. Busqué en la red y encontré códigos Zing, sin embargo, muchos desarrolladores tuvieron problemas para usarlo y parece que tiene errores.Android, ¿Cómo leer el código QR en mi aplicación?

Si asumo que mis clientes tienen qr reader instalado en su dispositivo, ¿cómo puedo usar esas aplicaciones y llamarlas mediante intentos implícitos?

si el usuario no tiene ningún lector qr, ¿qué pasará con la aplicación? si se bloquea, ¿puedo pedirle al usuario que descargue, por ejemplo, QrDroid y luego usarlo?

Respuesta

55
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); 

} 

y en 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 
     } 
    } 
} 
+0

este código para escanear código de barras o código QR ...? –

+0

sí. Utiliza la aplicación de escaneo de códigos de barras de Zxing –

+0

Pequeño error: agregaste una L extra a "cancelado" –

2

Usa una biblioteca QR como ZXing ... Tuve una muy buena experiencia con ella, QrDroid es mucho más complicado. Si debe confiar en un lector externo, ¡confíe en uno estándar como Google Goggles!

5

He creado un ejemplo sencillo tutorial. Puedes leer esto y usarlo en tu aplicación.

http://ribinsandroidhelper.blogspot.in/2013/03/qr-code-reading-on-your-application.html

A través de este enlace se puede descargar el proyecto de biblioteca qrcode e importar en su espacio de trabajo y añadir la biblioteca a su proyecto

y copiar este código a su actividad

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 
     } 
    } 
} 
+0

Hola, ¿puede ampliar su respuesta? Casi las respuestas de solo enlace no son útiles si el enlace se rompe. – orique

+0

hola mi respuesta está editada, puede revisar esto y debe mirar el enlace de la url en la respuesta –

+0

Dice que el archivo está en desuso – Eenvincible

14

si el usuario no tiene ningún lector qr, ¿qué pasará con la aplicación? si se bloquea, ¿puedo pedirle al usuario que descargue, por ejemplo, QrDroid y luego usarlo?

Curiosamente, Google ahora ha introducido Mobile Vision APIs, están integrados en los servicios de juego en sí.

En el archivo Gradle sólo tiene que añadir:

compile 'com.google.android.gms:play-services-vision:9.6.1' 

Tomado de esta QR code tutorial.

+0

Esto requiere que Google Services esté instalado en el dispositivo de destino, lo que no todos los teléfonos tienen. –

9

Zxing es una excelente biblioteca para realizar la exploración y generación de códigos Qr. La siguiente aplicación utiliza la biblioteca ZXing para escanear la imagen de código QR no se olvide de añadir después de la dependencia en el build.gradle

compile 'me.dm7.barcodescanner:zxing:1.9' 

Código actividad escáner:

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(); 
    } 
} 
+1

este código está en la aplicación, esta debería ser la respuesta aceptada – matheszabi

+1

obtuve una pantalla blanca cuando inicie la actividad de QRcode – kemdo

+0

Si obtiene una pantalla blanca, intente con " "en la sección de su AndroidManifest.xml, como se describe en https://github.com/dm77/barcodescanner. – jorgen

0

En Android Studio, puede utilizar abajo proceso para crear una imagen & Leer QR Code & parecerse bellw enter image description here

  1. Crear un proyecto vacío de estudio de Android
  2. Agregar biblioteca en la aplicación.Gradle

    compile 'com.google.zxing:core:3.2.1' 
    compile 'com.journeyapps:zxing-android-embedded:[email protected]' 
    
  3. En activity.main utilizar XML abajo ..

    <?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> 
    
  4. En MainActivity puede utilizar el código abajo

    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); 
        } 
        } 
    } 
    
  5. Puede descargar el código fuente completo de GitHub. El enlace de GitHub es: https://github.com/enamul95/QRCode

Cuestiones relacionadas