Integrar ZXing en Android Studio

93

Empezaré explicando todos los pasos que he realizado y al final cuál es el problema.

  1. Descarga ZXing-2.2 https://code.google.com/p/zxing/downloads/list
  2. Extraiga todo en zxing-2.2.
  3. Descargue e instale Apache Ant http://www.youtube.com/watch?v=XJmndRfb1TU
  4. Con el uso de la línea de comandos de Windows (Ejecutar-> CMD) navegue hasta el directorio extraído
  5. En la ventana de la línea de comandos, escriba 'ant -f core / build.xml' presione enter y deje que Apache funcione, es mágico

En este momento es como integrar la biblioteca ZXing directamente en mi aplicación de Android

Pero Wooops, "Buildfile: core \ build.xml no existe! La compilación falló. Ok. 6. Importando ZXing - falta core / build.xml

Ahora sí, tengo mi core.jar.

  1. Abra Android Studio, Archivo -> Importar proyecto -> Seleccionar / android / en /zxing-2.2/ -> Crear proyecto a partir de fuentes existentes -> Nombre del proyecto: andoid -> Archivos fuente para ... todos marcados Siguiente -> Bibliotecas (no no hacer nada) Siguiente -> Módulos (android marcado) Siguiente -> SDK 1.7 Siguiente -> Finalizar

Con Proyecto Abierto -> Construir -> Reconstruir proyecto

100 errores 19 advertencias

Archivo -> Estructura del proyecto -> Bibliotecas -> Agregar -> Java -> Seleccionar core.jar que creo antes y OK -> Biblioteca 'core' se agregará a los módulos seleccionados. (android) OK -> Y OK en el cuadro de diálogo Estructura del proyecto.

Construir -> Reconstruir proyecto

15 errores 20 advertencias

Todos los errores son errores: se requiere una expresión constante y veo Error en los casos de cambio del proyecto ZXing en Android . Cambio todos los conmutadores por si más.

0 errores 20 advertencias

Ok, ahora continúa:

Archivo -> Nuevo proyecto -> zxing_demo Siguiente -> Siguiente -> Actividad en blanco Siguiente -> Finalizar

En nuevo proyecto -> Archivo -> Módulo de importación -> Buscar y seleccionar / android / OK -> Crear módulo a partir de fuentes existentes Siguiente -> Siguiente -> Siguiente -> Siguiente -> Finalizar

Ahora puedo ver en el explorador / android / / zging_demoProject / y las bibliotecas externas

Ahora cambio mi código para escanear QR

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.zxing_demo"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="7"
    android:targetSdkVersion="16" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature
    android:name="android.hardware.camera.autofocus"
    android:required="false" />
<uses-feature
    android:name="android.hardware.touchscreen"
    android:required="false" />
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.zxing_demo.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

MainActivity.java

package com.example.zxing_demo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent intent = new Intent("com.google.zxing.client.android.SCAN");
    intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
    startActivityForResult(intent, 0);
}


public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == 0) {
        if (resultCode == RESULT_OK) {
            String contents = intent.getStringExtra("SCAN_RESULT");
            String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
            // Handle successful scan
        } else if (resultCode == RESULT_CANCELED) {
            // Handle cancel
        }
    }
}

}

Ahora prueba, Ejecuta -> Depurar

Y CRASH.

Logcat

08-31 02:58:28.085  20665-20665/com.example.zxing_demo E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.zxing_demo/com.google.zxing.client.android.CaptureActivity}: java.lang.ClassNotFoundException: com.google.zxing.client.android.CaptureActivity
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1891)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
    at android.app.ActivityThread.access$600(ActivityThread.java:127)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4448)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.ClassNotFoundException: com.google.zxing.client.android.CaptureActivity
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1882)
    ... 11 more

Puedo ver en AndroidManifest.xml en esta línea

android:name="com.google.zxing.client.android.CaptureActivity"

"CaptureActivity" en rojo y el error dice: No se puede resolver el símbolo 'CaptureActivity'

Archivo -> Estructura del proyecto -> Módulos -> zxing_demo -> Dependencias -> Agregar -> Dependencia del módulo -> Android OK -> Aplicar y OK

Ahora CaptureActivity se ve bien

Depurar de nuevo

08-31 03:06:58.513  21740-21740/com.example.zxing_demo E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.zxing_demo/com.google.zxing.client.android.CaptureActivity}: java.lang.ClassNotFoundException: com.google.zxing.client.android.CaptureActivity
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1891)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
    at android.app.ActivityThread.access$600(ActivityThread.java:127)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4448)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.ClassNotFoundException: com.google.zxing.client.android.CaptureActivity
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1882)
    ... 11 more

Creo que usaré la aplicación y las intenciones, pero ahora quiero hacer este trabajo, si alguien ahora qué pasa, dímelo por favor.

Victor Company
fuente
Esta pregunta tiene muchas visitas, así que en caso de que ayude a alguien [aquí está mi problema muy similar] [1] [1]: stackoverflow.com/questions/20334572/…
Daniel Wilson

Respuestas:

234

Estaba integrando ZXING en una aplicación de Android y no había buenas fuentes para la entrada, les daré una pista sobre lo que funcionó para mí, porque resultó ser muy fácil .

Hay un repositorio git realmente útil que proporciona el zxingproyecto de la biblioteca de Android como un archivo AAR.

Todo lo que tienes que hacer es agregar esto a tu build.gradle

repositories {
    jcenter()
}

dependencies {
    implementation 'com.journeyapps:zxing-android-embedded:3.0.2@aar'
    implementation 'com.google.zxing:core:3.2.0'
}

y Gradle hace toda la magia para compilar el código y hacerlo accesible en su aplicación.

Para iniciar el escáner posteriormente, use esta clase / método: De la actividad:

new IntentIntegrator(this).initiateScan(); // `this` is the current Activity

De un fragmento:

IntentIntegrator.forFragment(this).initiateScan(); // `this` is the current Fragment
// If you're using the support library, use IntentIntegrator.forSupportFragment(this) instead.

Hay varias opciones de personalización:

IntentIntegrator integrator = new IntentIntegrator(this);
integrator.setDesiredBarcodeFormats(IntentIntegrator.ONE_D_CODE_TYPES);
integrator.setPrompt("Scan a barcode");
integrator.setCameraId(0);  // Use a specific camera of the device
integrator.setBeepEnabled(false);
integrator.setBarcodeImageEnabled(true);
integrator.initiateScan();

Tienen un proyecto de muestra y están proporcionando varios ejemplos de integración:

Si ya visitó el enlace, verá que simplemente copié y pegué el código del README de git. Si no es así, vaya allí para obtener más información y ejemplos de código.

Langusten Gustel
fuente
3
Gran ayuda. Había pasado más de un día tratando de importar Zxing de otro proyecto y no llegaba a ninguna parte. Luego encontré este enlace y BAM está hecho. Simplemente siga el ejemplo de código anterior desde este enlace: github.com/zxing/zxing/wiki/Scanning-Via-Intent .
Jack BeNimble
1
¡¡El código funciona !! Tengo un problema, quiero un retrato de escáner y necesito agregar un diseño personalizado para la pantalla de escaneo ¿Alguien puede decirme cómo lograrlo?
Harsh Trivedi
2
Para cambiar la orientación, cree una nueva actividad que amplíe CaptureActivity y especifique la orientación en su AndroidManifest.xml.
ChaturaM
Al intentar ejecutar mi aplicación usando ContinuousCapture en Fragment: Error: Error de ejecución para la tarea ': app: transformClassesWithDexForDebug'. > com.android.build.transform.api.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command' C: \ Program Files \ Java \ jdk1.8.0 _60 \ bin \ java.exe '' terminó con un valor de salida 2 distinto de cero
Konstantin Konopko
1
@Janpan; si lo hace!
Langusten Gustel
7
buttion.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                new com.google.zxing.integration.android.IntentIntegrator(Fragment.this).initiateScan();
            }
        });

    public 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_LONG).show();
            } else {
                Log.d("MainActivity", "Scanned");
                Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
            }
        } else {
            // This is important, otherwise the result will not be passed to the fragment
            super.onActivityResult(requestCode, resultCode, data);
        }
    }



dependencies {
    compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar'
    compile 'com.google.zxing:core:3.2.1'
    compile 'com.android.support:appcompat-v7:23.1.0'
}
Hardip
fuente
7

Cualquiera que enfrente los mismos problemas, siga los sencillos pasos:

Importe el proyecto androiddesde zxing-masterel archivo zip descargado usando la opción Import project (Eclipse ADT, Gradle, etc.)y agregue las 2 líneas de códigos en su build.gradlearchivo de nivel de aplicación y estará listo para ejecutar.

Tan simple, yahh ...

dependencies {
        // https://mvnrepository.com/artifact/com.google.zxing/core
        compile group: 'com.google.zxing', name: 'core', version: '3.2.1'
        // https://mvnrepository.com/artifact/com.google.zxing/android-core
        compile group: 'com.google.zxing', name: 'android-core', version: '3.2.0'

    }

Siempre puede encontrar la última versión corey android coredesde los siguientes enlaces:

https://mvnrepository.com/artifact/com.google.zxing/core/3.2.1 https://mvnrepository.com/artifact/com.google.zxing/android-core/3.2.0

ACTUALIZACIÓN (29.05.2019)

En su lugar, agregue estas dependencias:

dependencies {
    implementation 'com.google.zxing:core:3.4.0'
    implementation 'com.google.zxing:android-core:3.3.0'
}
Smeet
fuente
Respuesta simple de Perefct :) Después de muchas I + D encontré este enlace, y parece que sucedió una magia.
Ramkesh Yadav
1
ahora la última versión Core y Android Core son dependencias {// mvnrepository.com/artifact/com.google.zxing/core grupo de implementación: 'com.google.zxing', nombre: 'core', versión: '3.3.2' / / mvnrepository.com/artifact/com.google.zxing/android-core grupo de implementación: 'com.google.zxing', nombre: 'android-core', versión: '3.3.0'}
Ramkesh Yadav
Quiero fusionar esto en un proyecto ya hecho, no quiero importarlo como un nuevo proyecto, entonces, ¿cómo puedo lograrlo? Se requiere ayuda urgente :)
Ramkesh Yadav
¡Gracias! También tuve que importar el proyecto y agregar dependencias.
CoolMind
0

Desde la versión 4.x, solo Android SDK 24+ es compatible de forma predeterminada y se requiere androidx.

Agregue lo siguiente a su archivo build.gradle:

repositories {
    jcenter()
}

dependencies {
    implementation 'com.journeyapps:zxing-android-embedded:4.1.0'
    implementation 'androidx.appcompat:appcompat:1.0.2'
}

android {
    buildToolsVersion '28.0.3' // Older versions may give compile errors
}

Versiones anteriores del SDK

Para las versiones de Android SDK <24, puede degradar zxing: core a 3.3.0 o anterior para compatibilidad con Android 14+:

repositories {
    jcenter()
}

dependencies {
    implementation('com.journeyapps:zxing-android-embedded:4.1.0') { transitive = false }
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'com.google.zxing:core:3.3.0'
}

android {
    buildToolsVersion '28.0.3'
}

También necesitará esto en su manifiesto de Android:

<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />

Fuente: https://github.com/journeyapps/zxing-android-embedded

Zhar
fuente
-1

este tutorial me ayuda a integrarme al estudio de Android: http://wahidgazzah.olympe.in/integrating-zxing-in-your-android-app-as-standalone-scanner/ si no, prueba ESTO

solo agregue a AndroidManifest.xml

<activity
         android:name="com.google.zxing.client.android.CaptureActivity"
         android:configChanges="orientation|keyboardHidden"
         android:screenOrientation="landscape"
         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>

¡Espero que esto ayude!.

hirigoshy
fuente
14
ambos enlaces son 404
prgmrDev
Eso no ayudó
deepakgates
@deepakgates: desactualizado, ¿puedes traer algún código para verificar?
hirigoshy