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 como esto: Escáner de código de barras
8 answers
No está integrado en el SDK, pero puede usar la biblioteca Zxing. Es gratuito, de código abierto y con licencia Apache.
La recomendación de 2016 es usar la API de código de barras , que también funciona sin conexión.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:36
Actualización de 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 Android Barcode API :
La API de código de barras detecta 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 el siguiente código de barras formatos:
- 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, AZTECA
Analiza automáticamente Códigos QR, Data Matrix, PDF-417 y valores Aztecas, para los siguientes formatos compatibles:
- URL
- Información de contacto (VCARD, etc.)
- Evento de calendario
- Correo electrónico
- Teléfono
- SMS
- ISBN
- WiFi
- Geolocalización (latitud y longitud)
- Licencia de conducir/ID de AAMVA
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-10 22:14:28
Aquí hay un código de ejemplo: mi aplicación utiliza ZXing Barcode Scanner.
Necesitas estas 2 clases: IntentIntegrator y IntentResult
-
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");
-
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"); } } }
Contents contiene el número de código de barras
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-17 16:41:37
Aquí está el código de ejemplo usando camera 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>
Construir.gradle (Módulo:app)
Add compile ' com.Google.androide.gms: play-services: 7.8.+'{[10] } en dependencias
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-07 06:43:31
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 se puede integrar muy fácilmente.
Aquí está la documentación de soporte para el uso de la biblioteca
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-19 08:06:24
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);
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-12 06:09:08
Con la API de escaneo de códigos de barras de Google Firebase ML Kit, puede leer datos codificados utilizando la mayoría de los formatos de códigos de barras estándar.
Https://firebase.google.com/docs/ml-kit/read-barcodes?authuser=0
Puede seguir este enlace para leer códigos de barras de manera eficiente.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-12 10:34:12
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>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-31 05:40:25