Cómo integrar el escáner de código de barras Zxing sin instalar la aplicación zxing real (no se puede resolver el símbolo:.androide.CaptureActivity)?


Quiero integrar zxing scanner en mi aplicación sin necesidad de una aplicación externa (zxing scanner de play store). Este es mi código

Button scan = (Button) findViewById(R.id.scan_button);
scan.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent("com.google.zxing.client.android.SCAN");
        intent.setPackage("com.mypackage.app");
        intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
        startActivityForResult(intent, SCANNER_REQUEST_CODE);
    }
});

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == SCANNER_REQUEST_CODE) {
        // Handle scan intent
        if (resultCode == Activity.RESULT_OK) {
            // Handle successful scan
            String contents = intent.getStringExtra("SCAN_RESULT");
            String formatName = intent.getStringExtra("SCAN_RESULT_FORMAT");
            byte[] rawBytes = intent.getByteArrayExtra("SCAN_RESULT_BYTES");
            int intentOrientation = intent.getIntExtra("SCAN_RESULT_ORIENTATION", Integer.MIN_VALUE);
            Integer orientation = (intentOrientation == Integer.MIN_VALUE) ? null : intentOrientation;
            String errorCorrectionLevel = intent.getStringExtra("SCAN_RESULT_ERROR_CORRECTION_LEVEL");

        } else if (resultCode == Activity.RESULT_CANCELED) {
            // Handle cancel
        }
    } else {
        // Handle other intents
    }

}

AndroidManifest.xml

<activity android:name="com.google.zxing.client.android.CaptureActivity"
    android:screenOrientation="landscape"
    android:configChanges="orientation|keyboardHidden"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
    android:windowSoftInputMode="stateAlwaysHidden">
    <intent-filter>
        <action android:name="com.google.zxing.client.android.SCAN"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

Mi Android Studio dijo que no puede resolver el símbolo: .android.CaptureActivity y si corro esto, ocurrió un error

Java.lang.ClassNotFoundException: No se encontró la clase " com.Google.zxing.cliente.androide.CaptureActivity "

¿Qué pasó?

Author: TofferJ, 2015-03-20

8 answers

Aunque ya se ha respondido me siento como una solución en profundidad para aquellos que quieren usar ZXing como una biblioteca sin usar ningún método de instalación automática como ANT.

ZXing al ser un proyecto de código abierto permite (como se describe en el sitio web de ZXing) utilizar sus características como una biblioteca de proyectos en lugar de forzar la instalación de aplicaciones de terceros en el dispositivo de los usuarios, en mi opinión, esta es la opción preferida para la mayoría de los proyectos.

Es importante tener en cuenta que de esta manera es aceptable por los creadores y no violará ninguno de sus términos de uso, ya que no vamos a copiar su código sino simplemente usarlo como una biblioteca de nuestro proyecto.

El proceso general es el siguiente:

  1. Descargando el código fuente ZXing y el archivo core.
  2. Importar el proyecto ZXing a cualquier entorno que desee (Eclipse/Studio)
  3. Definir el proyecto ZXing para que actúe como una biblioteca y fijar el código para cumplir con estos requisitos.
  4. Añadiendo ZXing a la ruta de construcción de tu propio proyecto
  5. Agregar métodos ZXing según lo requiera su aplicación.

Aquí hay un procedimiento completamente detallado para aquellos que usan Eclipse (que también se puede implementar muy fácilmente para Studio):

Descargar el código fuente ZXing y el archivo core

  1. Vaya a la página del proyecto GitHub de ZXing ( https://github.com/zxing/zxing ) y haga clic en "Descargar zip".
  2. Extraer los archivos (recomiendo usar en algún lugar la mayoría de sus otras fuentes de la biblioteca se encuentran)

Importar el proyecto ZXing a Eclipse

  1. Eclipse abierto.
  2. Haga clic en Archivo>Importar,>Android> "Código Android existente en el espacio de trabajo", desde la ventana de selección vaya a la carpeta donde extrajo el archivo zip ZXing y seleccione la carpeta "Android". Eclipse ahora debe detectar la carpeta contiene un proyecto llamado "CaptureActivity", importar ese proyecto.
  3. Ahora deberías ver captura actividad en tu espacio de trabajo. Dependiendo de la versión de ZXing que tiene puede que necesite asignar core.archivo jar el proyecto ZXing, para comprobar si este es el caso de su versión abra la carpeta libs del proyecto CaptureActivity y compruebe si núcleo.jar archivo existe, si no que usted tiene que añadirlo usted mismo, de lo contrario, pasa al siguiente capítulo.

    5.1. Para añadir el núcleo.haga clic con el botón derecho en el proyecto CaptureActivity en el espacio de trabajo de Eclipse y seleccione Ruta de compilación>configurar construir ruta

    5.2. En el menú lateral, seleccione Java Build Path y haga clic en la pestaña Libraries (Bibliotecas).

    5.3.Haga clic en "Agregar JARs externos" y vaya a donde exportó originalmente ZXing zip.

    5.4. Introduzca la carpeta core y seleccione core.jar (el nombre puede diferir en función de la versión ZXing) y haga clic en abrir

    5.5. Ahora deberías ver core.jar en tu lista de rutas de compilación, haz clic en la pestaña" Ordenar y exportar " y comprueba core.jar

Definición de ZXing como biblioteca y fijación el código

  1. Si aún no está en la ventana ruta de compilación, haga clic con el botón derecho en el proyecto CaptureActivity y seleccione Ruta de compilación>configurar ruta de compilación.
  2. Desde el menú lateral, seleccione Android y marque Is Library, haga clic en Ok para salir de la ventana
  3. Ahora, dependiendo de la versión de ZXing que tenga, es posible que Eclipse marque algunos de los archivos java que contienen errores, si este es el caso, tendrá que arreglar el código para que coincida con la versión de java de Android, de lo contrario simplemente mueva al siguiente capítulo

    8.1. Abra cada archivo java roto en el editor y reemplace las sentencias Switch rotas con una cadena de sentencias If Else, esta es una parte molesta que conozco.

Agregue ZXing como una biblioteca de su propio proyecto

  1. Si todo está bien ahora, CaptureActivity debería aparecer como cualquier carpeta de proyecto normal en su espacio de trabajo, ¡sin errores o rojo ! firmar. Para definir ZXing como una biblioteca en su propio proyecto, haga clic con el botón derecho en el espacio de trabajo y seleccione Ruta de compilación>Configurar ruta de compilación.
  2. En el menú lateral, seleccione Android. Haga clic en el botón Agregar en la parte inferior derecha de la ventana y desde la ventana seleccione CaptureActivity.
  3. Eso es todo, su proyecto ahora puede usar ZXing como una biblioteca independiente sin la necesidad de ninguna instalación de terceros.

Agregar los métodos de ZXing requeridos por su aplicación

Esta parte no es realmente una guía, sino simplemente lo que encontré útil para mis propias necesidades hasta ahora, los dos métodos que uso principalmente son estos:

Ejecutar el escáner y capturar un código QR:

Intent intent = new Intent(getApplicationContext(),CaptureActivity.class);
intent.setAction("com.google.zxing.client.android.SCAN");
intent.putExtra("SAVE_HISTORY", false);
startActivityForResult(intent, 0);

Recuperando los resultados de la exploración en onActivityResult ():

if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = data.getStringExtra("SCAN_RESULT");
Log.d(TAG, "contents: " + contents);
} else if (resultCode == RESULT_CANCELED) {
// Handle cancel
Log.d(TAG, "RESULT_CANCELED");
}
}

Tenga en cuenta que al igual que cualquier otra actividad en la actividad de captura de Android también debe definirse en el manifiesto del proyecto, también tenga en cuenta que debe dar permiso al proyecto para usar la cámara de esta manera :

<uses-permission android:name="android.permission.CAMERA" />
<activity
android:name="com.google.zxing.client.android.CaptureActivity"
android:screenOrientation="landscape" >
</activity>

Espero que esto ayude a otros a ahorrar unas buenas horas de investigación.

Como un bono adicional recomiendo leer : https://biocram.wordpress.com/2013/06/11/integrate-zxing-as-a-library-inside-an-android-project/

 42
Author: Liran Cohen,
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-04-23 08:49:37

Como todas las respuestas que he encontrado hasta ahora se basan en Eclipse y son bastante anticuadas a partir de ahora, estoy agregando mi respuesta para agregar ZXing como una biblioteca independiente en Android Studio (2.1.2).

He puesto el proyecto compilado en Github https://github.com/tarun0/ZXing-Standalone-library Simplemente agrega el módulo zxing_standalone en tu proyecto y estarás listo. Para más detalles o para compilarlo para las versiones más recientes, siga leyendo.

Puede parecer un procedimiento largo, pero una vez que pasa lo encontrarás bastante fácil y corto.

  1. Descargue el código fuente de la biblioteca ZXing desde https://github.com/zxing/zxing / Solo necesitaremos el directorio android de esto. Por lo tanto, si ya tiene esta carpeta, no necesita descargar toda la rama, que tiene aproximadamente 126 MB de tamaño.
  2. Descargue la última core-x.x.x.jar de http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1 /
  3. Añade el proyecto Android a tu propio proyecto. Hacer esto, en primer lugar, elegir el Project de la Project Explorer (consulte la imagen)

introduzca la descripción de la imagen aquí

  1. Ahora haga clic en su proyecto y luego haga clic derecho en él y seleccione New>Module>Import Gradle Project. Ahora, en seleccione el directorio android del código fuente descargado (en el paso 1). (Foto de referencia abajo para el novato absoluto). Opcionalmente, cambie el nombre y deje que la configuración predeterminada para la importación. introduzca la descripción de la imagen aquí
  2. En este proyecto importado, hacer una carpeta libs y poner el core.jar archivo descargado en el paso 2 en esta carpeta. Luego abra Project Structure desde el menú archivo y agregue este archivo core.jar como una dependencia.

introduzca la descripción de la imagen aquí En el paso 2 Seleccione  Add file dependency

  1. Descargar CameraConfigurationalUtils.java y péguelo en el proyecto. introduzca la descripción de la imagen aquí

  2. Ahora haz algunas modificaciones en el archivo gradle del proyecto importado. Cambie apply plugin: 'com.android.application' a apply plugin: 'com.android.library' para decirle al sistema que es una biblioteca. Y eliminar el applicationId ... instrucción.

  3. En el archivo Manifest.xml del proyecto importado, realice las siguientes modificaciones. En la etiqueta <application..., elimine android:icon... y android:logo...y elimine esto <category android:name="android.intent.category.LAUNCHER"/> del filtro de intent, ya que ahora es una biblioteca y no se supone que esté en el lanzador (si no elimina esto, terminará teniendo dos actividades de lanzador).

  4. En el archivo build.gradle de su proyecto, en el bloque dependencies, agregue esta línea compile project (':android') Aquí, reemplace el android con el nombre que eligió al importar el proyecto en el paso 4. Sincroniza y limpia el proyecto. Verás algunos errores en las sentencias switch. Haga clic en los casos de cambio y seleccione la opción replace with if opción proporcionada por Android Studio.

Eso es todo. Ahora puede usar la biblioteca ZXing en su propia aplicación. :)

Para usar la biblioteca agregada, simplemente use el Intents como se indica en la primera respuesta anterior (copiando los mismos códigos solamente):

Mientras escanea (como al hacer clic en un botón), envíe Intención:

Intent intent = new Intent(getApplicationContext(),CaptureActivity.class);
intent.setAction("com.google.zxing.client.android.SCAN");
intent.putExtra("SAVE_HISTORY", false);
startActivityForResult(intent, 0);

Luego, en OnActivityResult:

if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = data.getStringExtra("SCAN_RESULT");
Log.d(TAG, "contents: " + contents);
} else if (resultCode == RESULT_CANCELED) {
// Handle cancel
Log.d(TAG, "RESULT_CANCELED");
}
}

Traté de ser lo más descriptivo posible. Espero que la gente lo encuentre útil.

Por favor, lea esta respuesta de uno de los autores del código con respecto a la copia del código en su propia aplicación: https://stackoverflow.com/a/9942761

Referencias: https://stackoverflow.com/a/29818279 https://stackoverflow.com/a/29960361 Y algunos otros blogs/SO respuestas.

 38
Author: T.M,
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 11:47:31

No se por qué sucedió, pero finalmente uso otra biblioteca. Uso Zxing-android-minimal y el tutorial de aquí y aquí. Ahora funciona.

 27
Author: stackex,
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:48

Llego muy tarde, pero deseo responder sobre esto para que alguien más pueda ser ayudado más tarde. Esto no quiere decir que los métodos anteriores y la solución son incorrectos, es solo una información adicional por lo que, para el desarrollador él/ella elegirá la mejor manera. Es bueno tener mil que tener uno.

Entonces, comencemos con nuestro gradle y agreguemos

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

Llamando al módulo como (por ejemplo: al hacer clic en el botón):

IntentIntegrator integrator = new IntentIntegrator(Home.this);
            integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);
            integrator.setPrompt("Scan Code");
            integrator.setCameraId(0);
            integrator.setBeepEnabled(true);
            integrator.setBarcodeImageEnabled(false);
            integrator.initiateScan();

Obtener los resultados como:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if(intentResult != null) {
        if(intentResult.getContents() == null) {
            Log.d("MainActivity", "Cancelled");
            Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();

        } else {
            Log.d("MainActivity", "Scanned");
            Toast.makeText(this, "Scanned: " + intentResult.getContents(), Toast.LENGTH_LONG).show();
        }
    }

}

Para más información puedes consultar el enlace https://github.com/pethoalpar/ZxingExample

 13
Author: Ishimwe Aubain Consolateur,
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-08-02 14:02:37

Si tienes problemas para encontrar el frasco como yo, aquí tienes la URL:

Http://repo1.maven.org/maven2/com/google/zxing /

 3
Author: Julián Vega,
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-10-20 13:40:55

Elaborando la respuesta de Stackex.... Crea una actividad con cualquier nombre.

public class CaptureActivityAnyOrientation extends CaptureActivity {
}

En manifest definir la orientación deseada o dejar como abajo para trabajar tanto en paisaje y portait.

<activity android:name=".CaptureActivityAnyOrientation"
      android:screenOrientation="fullSensor"
      android:stateNotNeeded="true"
      android:theme="@style/zxing_CaptureTheme"
      android:windowSoftInputMode="stateAlwaysHidden"/>

Finalmente use la actividad creada como setCaptureActivity.

IntentIntegrator.forSupportFragment(fragment)
                    .setCaptureActivity(CaptureActivityAnyOrientation.class)
                    .setOrientationLocked(false)
                    .setBeepEnabled(true)
                    .addExtra("PROMPT_MESSAGE", "Scan QR Code")
                    .initiateScan(IntentIntegrator.QR_CODE_TYPES);

Espero que esto ayude.

 2
Author: Sachet Bajracharya,
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-03-17 05:33:16

En mi código llegué a esta versión:

Camera.PreviewCallback myCallBack = new Camera.PreviewCallback() {
   @Override public void onPreviewFrame(byte[] data, Camera camera)
   {
      Camera.Parameters parameters = camera.getParameters();
      int width = parameters.getPreviewSize().width;
      int height = parameters.getPreviewSize().height;
      int format = parameters.getPreviewFormat();
      LuminanceSource source = null;
      if(format == ImageFormat.NV21) //YCbCr_420_SP)
      {
         source = new PlanarYUVLuminanceSource(imgData, bitmapWidth, bitmapHeight, 0,0, bitmapWidth,bitmapHeight, false);
      } else
      {
         throw new UnsupportedOperationException("Unsupported image format ");
      }
      BinaryBitmap bBitmap = new BinaryBitmap(new HybridBinarizer(source));
      try
      {
         Result result = reader.decode(bBitmap);
         txt.setText(result.getText())
      } catch (NotFoundException e)
      {
         //txt.setText("");
      }
   }
};

Con

import android.hardware.Camera;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.PlanarYUVLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;

Camera mCamera;
MultiFormatReader reader;
TextView txt;

Espero que esto ayude a alguien.

Antonino

 2
Author: Perry,
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-11-15 09:03:12

Aquí hay una manera que funciona en eclipse:

Integración de ZXing en eclipse android app

¡Feliz integración !

 0
Author: Hubert Solecki,
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:10:42