studio programa para leer lector con como codigo celular barras app aplicacion android barcode barcode-scanner

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



leer codigo qr android sin app (8)

aplicación del módulo:

implementation ''com.google.zxing:core:3.2.1'' implementation ''com.journeyapps:zxing-android-embedded:3.2.0@aar''

AndroidManifest.xml

<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus"/>

MainActivity.java

public class MainActivity extends AppCompatActivity { Button BarCode; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); BarCode = findViewById(R.id.button_barcode); final Activity activity = this; BarCode.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { IntentIntegrator intentIntegrator = new IntentIntegrator(activity); intentIntegrator.setDesiredBarcodeFormats(intentIntegrator.ALL_CODE_TYPES); intentIntegrator.setBeepEnabled(false); intentIntegrator.setCameraId(0); intentIntegrator.setPrompt("SCAN"); intentIntegrator.setBarcodeImageEnabled(false); intentIntegrator.initiateScan(); } }); } @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.d("MainActivity" , "cancelled scan"); Toast.makeText(this, "cancelled", Toast.LENGTH_SHORT).show(); } else { Log.d("MainActivity" , "Scanned"); Toast.makeText(this,"Scanned -> " + Result.getContents(), Toast.LENGTH_SHORT).show(); } } else { super.onActivityResult(requestCode , resultCode , data); } } }

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

Algo así: escáner de código de barras


Actualización 2016

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

Desde la developers.google.com/vision/barcodes-overview :

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, Código-39, Código-93, Código-128, ITF, Codabar
  • Códigos de barras 2D: Código QR, Matriz de datos, PDF-417, AZTEC

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

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

Aquí está el código de ejemplo utilizando 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: aplicación)

agregar compilar ''com.google.android.gms: play-services: 7.8. +'' en dependencias


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

  1. Necesitas estas 2 clases: IntentIntegrator e IntentResult

  2. Escáner de llamadas (por ejemplo, OnClickListener, OnMenuItemSelected ...), "PRODUCT_MODE" - escanea códigos de barras 1D estándar (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"); } } }

el contenido contiene el código de barras



También puede usar barcodefragmentlib que es una extensión de zxing, pero proporciona escaneo de códigos de barras como biblioteca de fragmentos, por lo que puede integrarse muy fácilmente.

Aquí está la documentation apoyo para el uso de la biblioteca


Tuve un problema con los argumentos 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(); } }; }

Latyout para la actividad:

<?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"/> </LinearLayout>


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

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