¿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
- Lector de códigos de barras / Qr para Android
- Controlar el valor del escáner de código de barras a través del dispositivo Android
- ¿Cómo leer los códigos de barras usando Android Phonegap?
- El uso del escáner de código de barras de Zxing causa la excepción de seguridad
- El paquete com.google.zxing falta en la biblioteca de códigos de barras de Zxing para Android
- Escanear códigos de barras múltiples con ZXing
- ¿Cómo mostrar un código de barras 1-D de cadena en Android?
- Escáner de código de barras ZXing para Webapps
- ZXing en Android PDF417
- ¿Por qué setColor es tan lento en Android?
- Elegir diálogo de archivo
- ¿Existen directrices de codificación para la plataforma Android que se centran en la seguridad?
- Cobertura de código con jacoco para una biblioteca de Android
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
- 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.
-
Necesita estas 2 clases: IntentIntegrator y IntentResult
-
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");
-
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"/>
- Anular el registro de Android Broadcast Receiver en onReceive lanza "Receptor no registrado"
- Reloj de arena androide