¿Cómo leer códigos de barras con la cámara en Android?

Quiero que mi aplicación reconozca los códigos de barras tomados por la cámara. ¿Es posible usar Android SDK?

Algo así: Barcode Scanner

No está incorporado en el SDK, pero puede utilizar la biblioteca Zxing . Es gratis, de código abierto y con licencia de Apache.

La recomendación de 2016 es usar la API de código de barras , que también funciona sin conexión.

Actualización 2016

Con la última versión de Google Play Services, v7.8, tiene acceso a la nueva API de Mobile Vision. Es probablemente la forma más conveniente de implementar el escaneado de códigos de barras ahora, y también funciona sin conexión .

Desde el Android Barcode API :

La API de código de barras detecta los códigos de barras en tiempo real, en el dispositivo, en cualquier orientación. También puede detectar múltiples códigos de barras a la vez.

Lee los siguientes formatos de código de barras:

  • Códigos de barras 1D: EAN-13, EAN-8, UPC-A, UPC-E, Code-39, Code-93, Code-128, ITF, Codabar
  • Códigos de barras 2D: Código QR, Data Matrix, PDF-417, AZTEC

Analiza automáticamente los códigos QR, Data Matrix, PDF-417 y Aztec, para los siguientes formatos compatibles:

  • URL
  • Información de contacto (VCARD, etc.)
  • Evento del calendario
  • Email
  • Teléfono
  • SMS
  • ISBN
  • Wifi
  • Geo-ubicación (latitud y longitud)
  • Licencia de conducir AAMVA / ID

Aquí hay un ejemplo de código: mi aplicación utiliza el escáner de código de barras ZXing.

  1. Necesita estas 2 clases: IntentIntegrator y IntentResult

  2. Escáner de llamadas (por ejemplo, OnClickListener, OnMenuItemSelected …), "PRODUCT_MODE": escanea los códigos de barras estándar 1D (puede agregar más) .:

    IntentIntegrator.initiateScan(this, "Warning", "ZXing Barcode Scanner is not installed, download?", "Yes", "No", "PRODUCT_MODE"); 
  3. Obtener código de barras como resultado:

     public void onActivityResult(int requestCode, int resultCode, Intent intent) { switch (requestCode) { case IntentIntegrator.REQUEST_CODE: if (resultCode == Activity.RESULT_OK) { IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); if (intentResult != null) { String contents = intentResult.getContents(); String format = intentResult.getFormatName(); this.elemQuery.setText(contents); this.resume = false; Log.d("SEARCH_EAN", "OK, EAN: " + contents + ", FORMAT: " + format); } else { Log.e("SEARCH_EAN", "IntentResult je NULL!"); } } else if (resultCode == Activity.RESULT_CANCELED) { Log.e("SEARCH_EAN", "CANCEL"); } } } 

Contenido contiene número de código de barras

He aquí un ejemplo de código usando la cámara api

 import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.util.SparseArray; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.io.IOException; import com.google.android.gms.vision.CameraSource; import com.google.android.gms.vision.Detector; import com.google.android.gms.vision.Frame; import com.google.android.gms.vision.barcode.Barcode; import com.google.android.gms.vision.barcode.BarcodeDetector; public class MainActivity extends AppCompatActivity { TextView barcodeInfo; SurfaceView cameraView; CameraSource cameraSource; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cameraView = (SurfaceView) findViewById(R.id.camera_view); barcodeInfo = (TextView) findViewById(R.id.txtContent); BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(this) .setBarcodeFormats(Barcode.CODE_128)//QR_CODE) .build(); cameraSource = new CameraSource .Builder(this, barcodeDetector) .setRequestedPreviewSize(640, 480) .build(); cameraView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { try { cameraSource.start(cameraView.getHolder()); } catch (IOException ie) { Log.e("CAMERA SOURCE", ie.getMessage()); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { cameraSource.stop(); } }); barcodeDetector.setProcessor(new Detector.Processor<Barcode>() { @Override public void release() { } @Override public void receiveDetections(Detector.Detections<Barcode> detections) { final SparseArray<Barcode> barcodes = detections.getDetectedItems(); if (barcodes.size() != 0) { barcodeInfo.post(new Runnable() { // Use the post method of the TextView public void run() { barcodeInfo.setText( // Update the TextView barcodes.valueAt(0).displayValue ); } }); } } }); } } 

Activity_main.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.gateway.cameraapibarcode.MainActivity"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <SurfaceView android:layout_width="640px" android:layout_height="480px" android:layout_centerVertical="true" android:layout_alignParentLeft="true" android:id="@+id/camera_view"/> <TextView android:text=" code reader" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/txtContent"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Process" android:id="@+id/button" android:layout_alignParentTop="true" android:layout_alignParentStart="true" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imgview"/> </LinearLayout> </RelativeLayout> 

Build.gradle (Módulo: app)

Add compile 'com.google.android.gms: play-services: 7.8 +' en dependencias

También puede utilizar barcodefragmentlib que es una extensión de zxing pero proporciona exploración de código de barras como biblioteca de fragmentos, por lo que se puede integrar muy fácilmente.

Aquí está la documentación de apoyo para el uso de la biblioteca

Tenía un problema con los argumentos de parseActivityForResult. Tengo esto para trabajar:

  package JMA.BarCodeScanner; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; public class JMABarcodeScannerActivity extends Activity { Button captureButton; TextView tvContents; TextView tvFormat; Activity activity; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); activity = this; captureButton = (Button)findViewById(R.id.capture); captureButton.setOnClickListener(listener); tvContents = (TextView)findViewById(R.id.tvContents); tvFormat = (TextView)findViewById(R.id.tvFormat); } public void onActivityResult(int requestCode, int resultCode, Intent intent) { switch (requestCode) { case IntentIntegrator.REQUEST_CODE: if (resultCode == Activity.RESULT_OK) { IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); if (intentResult != null) { String contents = intentResult.getContents(); String format = intentResult.getFormatName(); tvContents.setText(contents.toString()); tvFormat.setText(format.toString()); //this.elemQuery.setText(contents); //this.resume = false; Log.d("SEARCH_EAN", "OK, EAN: " + contents + ", FORMAT: " + format); } else { Log.e("SEARCH_EAN", "IntentResult je NULL!"); } } else if (resultCode == Activity.RESULT_CANCELED) { Log.e("SEARCH_EAN", "CANCEL"); } } } private View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { IntentIntegrator integrator = new IntentIntegrator(activity); integrator.initiateScan(); } }; } <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/capture" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Take a Picture" /> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tvContents" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tvFormat" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 
  • ¿Es posible mostrar números bajo un código de barras de una dimensión generado por ZXing?
  • Longitud máxima de un código de barras Código 128
  • Biblioteca de escáner de código de barras para android que no sea zxing
  • Comentarios de las muestras de Android BEGIN_INCLUDE END_INCLUDE
  • Android Vision Barcode API - leer código QR personalizado con datos binarios
  • La vista web de Android SKIPS javascript incluso con setJavascriptEnabled (true) y WebChromeClient
  • Lectura de códigos de barras con android
  • Uso de ZXing para crear una aplicación de escaneo de códigos de barras Android
  • ZXing cómo escanear código QR y código de barras 1D?
  • Integración de la biblioteca de ZXing directamente en mi aplicación de Android
  • Crear / Generar código de barras usando Zxing en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.