Integrieren Sie ZXing in Android Studio

93

Ich werde anfangen, alle Schritte zu erklären, die ich getan habe, und am Ende, was das Problem ist.

  1. Laden Sie ZXing-2.2 https://code.google.com/p/zxing/downloads/list herunter
  2. Extrac alles in zxing-2.2.
  3. Laden Sie Apache Ant http://www.youtube.com/watch?v=XJmndRfb1TU herunter und installieren Sie es
  4. Navigieren Sie mit der Windows-Befehlszeile (Run-> CMD) zum extrahierten Verzeichnis
  5. Im Befehlszeilenfenster - Geben Sie 'ant -f core / build.xml' ein, drücken Sie die Eingabetaste und lassen Sie Apache arbeiten, es ist magisch

In diesem Moment ist es so, als würde man die ZXing-Bibliothek direkt in meine Android-Anwendung integrieren

Aber Wooops, "Buildfile: core \ build.xml existiert nicht! Build fehlgeschlagen. Ok. 6. Importieren von ZXing - fehlender core / build.xml

Jetzt ja, ich habe mein core.jar.

  1. Öffnen Sie Android Studio, Datei -> Projekt importieren -> Wählen Sie / android / in /zxing-2.2/ -> Projekt aus vorhandenen Quellen erstellen -> Projektname: andoid -> Quelldateien für ... alle aktiviert Weiter -> Bibliotheken (nicht) nichts tun) Weiter -> Module (Android aktiviert) Weiter -> SDK 1.7 Weiter -> Fertig stellen

Mit Projekt Öffnen -> Erstellen -> Projekt neu erstellen

100 Fehler 19 Warnungen

Datei -> Projektstruktur -> Bibliotheken -> Hinzufügen -> Java -> Core.jar auswählen, die ich zuvor erstellt habe, und OK -> Bibliothek 'Core' wird zu den ausgewählten Modulen hinzugefügt. (android) OK -> Und OK im Projektstrukturdialog.

Erstellen -> Projekt neu erstellen

15 Fehler 20 Warnungen

Alle Fehler sind Fehler: Konstanter Ausdruck erforderlich und ich sehe Fehler in Switch-Fällen des ZXing-Projekts in Android. Ich ändere alle Schalter für wenn sonst.

0 Fehler 20 Warnungen

Ok, jetzt weiter:

Datei -> Neues Projekt -> zxing_demo Weiter -> Weiter -> Leere Aktivität Weiter -> Fertig stellen

In neuem Projekt -> Datei -> Modul importieren -> Suchen und / android / OK auswählen -> Modul aus vorhandenen Quellen erstellen Weiter -> Weiter -> Weiter -> Weiter -> Fertig stellen

Jetzt kann ich im Explorer / android / / zging_demoProject / und in den externen Bibliotheken sehen

Jetzt ändere ich meinen Code, um QR zu scannen

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
        }
    }
}

}

Testen Sie nun Ausführen -> Debuggen

Und Absturz.

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

Ich kann in AndroidManifest.xml in dieser Zeile sehen

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

"CaptureActivity" in Rot und der Fehler lautet: Symbol 'CaptureActivity' kann nicht aufgelöst werden

Datei -> Projektstruktur -> Module -> zxing_demo -> Abhängigkeiten -> Hinzufügen -> Modulabhängigkeit -> Android OK -> Übernehmen und OK

Jetzt sieht CaptureActivity gut aus

Debuggen Sie erneut

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

Ich denke, ich werde die Anwendung und Absichten verwenden, aber jetzt möchte ich diese Arbeit machen, wenn jemand jetzt was passiert, sag es mir bitte.

Victor Company
quelle
Diese Frage hat viele Ansichten, nur für den Fall, dass sie jemandem hilft [hier ist mein sehr ähnliches Problem] [1] [1]: stackoverflow.com/questions/20334572/…
Daniel Wilson

Antworten:

234

Ich habe ZXING in eine Android-Anwendung integriert und es gab keine guten Quellen für die Eingabe. Ich werde Ihnen einen Hinweis geben, was für mich funktioniert hat - weil es sich als sehr einfach herausstellte .

Es gibt ein wirklich praktisches Git-Repository, das das zxingAndroid-Bibliotheksprojekt als AAR-Archiv bereitstellt .

Alles was Sie tun müssen, ist dies zu Ihrem build.gradle hinzuzufügen

repositories {
    jcenter()
}

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

und Gradle macht die ganze Magie, um den Code zu kompilieren und macht ihn in Ihrer App zugänglich.

Verwenden Sie diese Klasse / Methode, um den Scanner anschließend zu starten: Aus der Aktivität:

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

Aus einem Fragment:

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

Es gibt verschiedene Anpassungsoptionen:

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();

Sie haben ein Beispielprojekt und bieten mehrere Integrationsbeispiele:

Wenn Sie den Link bereits besucht haben, werden Sie sehen, dass ich den Code aus der Git-README-Datei kopiert und eingefügt habe. Wenn nicht, gehen Sie dorthin, um weitere Einblicke und Codebeispiele zu erhalten.

Langusten Gustel
quelle
3
Riesige Hilfe. Ich hatte über einen Tag damit verbracht, Zxing aus einem anderen Projekt zu importieren und kam nicht weiter. Dann habe ich diesen Link gefunden und BAM ist fertig. Folgen Sie einfach dem obigen Codebeispiel über diesen Link: github.com/zxing/zxing/wiki/Scanning-Via-Intent .
Jack BeNimble
1
Code funktioniert !! Ich habe ein Problem, ich möchte ein Scannerporträt und muss ein benutzerdefiniertes Layout für den Scanbildschirm hinzufügen. Kann mir jemand sagen, wie ich das erreichen soll?
Harsh Trivedi
2
Um die Ausrichtung zu ändern, erstellen Sie eine neue Aktivität, die CaptureActivity erweitert, und geben Sie die Ausrichtung in Ihrer AndroidManifest.xml an.
ChaturaM
Beim Versuch, meine App mit ContinuousCapture in Fragment auszuführen: Fehler: Die Ausführung der Aufgabe ': app: transformClassesWithDexForDebug' ist fehlgeschlagen. > com.android.build.transform.api.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Prozess 'Befehl' C: \ Programme \ Java \ jdk1.8.0 _60 \ bin \ java.exe '' beendet mit einem Exit-Wert ungleich Null 2
Konstantin Konopko
1
@ Janpan; ja tut es!
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
quelle
7

Wenn Sie mit denselben Problemen konfrontiert sind, befolgen Sie die einfachen Schritte:

Importieren Sie das Projekt mit der Option androidaus der heruntergeladenen zxing-masterZip-Datei Import project (Eclipse ADT, Gradle, etc.)und fügen Sie die folgenden 2 Codezeilen in Ihre build.gradleDatei auf App-Ebene ein. Dann können Sie loslegen .

So einfach, 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'

    }

Sie finden immer die neueste Version coreund die android corefolgenden Links:

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

UPDATE (29.05.2019)

Fügen Sie stattdessen diese Abhängigkeiten hinzu:

dependencies {
    implementation 'com.google.zxing:core:3.4.0'
    implementation 'com.google.zxing:android-core:3.3.0'
}
Smeet
quelle
Perefct einfache Antwort :) Nach vielen F & E habe ich diesen Link gefunden, und es sieht so aus, als wäre eine Magie passiert.
Ramkesh Yadav
1
Jetzt Neueste Version Core und Android Core sind Abhängigkeiten {// mvnrepository.com/artifact/com.google.zxing/core Implementierungsgruppe: 'com.google.zxing', Name: 'core', Version: '3.3.2' / / mvnrepository.com/artifact/com.google.zxing/android-core Implementierungsgruppe: 'com.google.zxing', Name: 'android-core', Version: '3.3.0'}
Ramkesh Yadav
Ich möchte dies in einem bereits erstellten Projekt zusammenführen und nicht als neues Projekt importieren. Wie kann ich dies erreichen? dringende Hilfe erforderlich :)
Ramkesh Yadav
Vielen Dank! Ich musste auch das Projekt importieren und Abhängigkeiten hinzufügen.
CoolMind
0

Ab Version 4.x wird standardmäßig nur Android SDK 24+ unterstützt, und Androidx ist erforderlich.

Fügen Sie Ihrer build.gradle-Datei Folgendes hinzu:

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
}

Ältere SDK-Versionen

Für Android SDK-Versionen <24 können Sie zxing: core auf 3.3.0 oder früher herunterstufen, um Android 14+ zu unterstützen:

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'
}

Sie benötigen dies auch in Ihrem Android-Manifest:

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

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

Zhar
quelle
-1

dieses Tutorial hilft mir android Studio zu integrieren: http://wahidgazzah.olympe.in/integrating-zxing-in-your-android-app-as-standalone-scanner/ wenn unten versucht THIS

einfach zu AndroidManifest.xml hinzufügen

<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>

Ich hoffe das hilft!.

Hirigoshy
quelle
14
Beide Links sind 404
prgmrDev
Das hat nicht geholfen
deepakgates
@deepakgates: veraltet, können Sie Code zur Überprüfung mitbringen?
Hirigoshy