Tích hợp ZXing trong Android Studio


93

Tôi sẽ bắt đầu giải thích tất cả các bước tôi đã làm và cuối cùng thì vấn đề là gì.

  1. Tải xuống ZXing-2.2 https://code.google.com/p/zxing/downloads/list
  2. Giải nén tất cả trong zxing-2.2.
  3. Tải xuống và cài đặt Apache Ant http://www.youtube.com/watch?v=XJmndRfb1TU
  4. Với việc sử dụng Dòng lệnh Windows (Run-> CMD), điều hướng đến thư mục được giải nén
  5. Trong cửa sổ dòng lệnh - Nhập 'ant -f core / build.xml', nhấn enter và để Apache hoạt động.

Tại thời điểm này, giống như việc Tích hợp thư viện ZXing trực tiếp vào ứng dụng Android của tôi

Nhưng thật tuyệt vời, "Buildfile: core \ build.xml không tồn tại! Xây dựng không thành công. Ok. 6. Nhập ZXing - thiếu core / build.xml

Bây giờ có, tôi có core.jar của mình.

  1. Mở Android Studio, Tệp -> Nhập Dự án -> Chọn / android / in /zxing-2.2/ -> Tạo dự án từ các nguồn hiện có -> Tên dự án: andoid -> Tệp nguồn cho ... tất cả được chọn Tiếp theo -> Thư viện (không thể không làm gì cả) Tiếp theo -> Mô-đun (đã kiểm tra android) Tiếp theo -> SDK 1.7 Tiếp theo -> Kết thúc

Với Mở dự án -> Xây dựng -> Xây dựng lại dự án

100 lỗi 19 cảnh báo

Tệp -> Cấu trúc dự án -> Thư viện -> Thêm -> Java -> Chọn core.jar mà tôi đã tạo trước đó và OK -> Thư viện 'lõi' sẽ được thêm vào các mô-đun đã chọn. (android) OK -> Và OK trong Hộp thoại Cấu trúc Dự án.

Xây dựng -> Xây dựng lại dự án

15 lỗi 20 cảnh báo

Tất cả các lỗi đều là lỗi: bắt buộc phải có biểu thức hằng và tôi thấy Lỗi trong các trường hợp Chuyển đổi của dự án ZXing trong Android Tôi thay đổi tất cả các công tắc cho if elses.

0 lỗi 20 cảnh báo

Ok, bây giờ tiếp tục:

Tệp -> Dự án mới -> zxing_demo Tiếp theo -> Tiếp theo -> Hoạt động trống Tiếp theo -> Kết thúc

Trong dự án mới -> Tệp -> Nhập mô-đun -> Tìm kiếm và chọn / android / OK -> Tạo mô-đun từ các nguồn hiện có Tiếp theo -> Tiếp theo -> Tiếp theo -> Tiếp theo -> Kết thúc

Bây giờ tôi có thể thấy trong explorer / android / / zging_demoProject / và Thư viện bên ngoài

Bây giờ tôi thay đổi mã của mình bằng cách quét 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
        }
    }
}

}

Bây giờ hãy kiểm tra, Chạy -> Gỡ lỗi

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

Tôi có thể thấy trong AndroidManifest.xml trong dòng này

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

"CaptureActivity" màu đỏ và lỗi cho biết: Không thể giải quyết biểu tượng 'CaptureActivity'

Tệp -> Cấu trúc dự án -> Mô-đun -> zxing_demo -> Phụ thuộc -> Thêm -> Phụ thuộc mô-đun -> android OK -> Áp dụng và OK

Bây giờ CaptureActivity có vẻ tốt

Gỡ lỗi lại

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

Tôi nghĩ rằng tôi sẽ sử dụng ứng dụng và ý định, nhưng bây giờ tôi muốn làm công việc này, nếu ai đó bây giờ có chuyện gì xảy ra hãy cho tôi biết.


Câu hỏi này có rất nhiều lượt xem vì vậy đề phòng nó giúp ích cho bất kỳ ai [đây là vấn đề rất giống tôi] [1] [1]: stackoverflow.com/questions/20334572/…
Daniel Wilson

Câu trả lời:


234

Tôi đang tích hợp ZXING vào một ứng dụng Android và không có nguồn nào tốt cho đầu vào cả, tôi sẽ cho bạn gợi ý về những gì phù hợp với tôi - bởi vì nó hóa ra rất dễ dàng .

Có một kho lưu trữ git tiện dụng thực sự cung cấp zxingdự án thư viện android dưới dạng kho lưu trữ AAR.

Tất cả những gì bạn phải làm là thêm cái này vào build.gradle của bạn

repositories {
    jcenter()
}

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

và Gradle thực hiện mọi điều kỳ diệu để biên dịch mã và làm cho nó có thể truy cập được trong ứng dụng của bạn.

Để khởi động Máy quét sau đó, hãy sử dụng lớp / phương thức này: Từ Hoạt động:

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

Từ một mảnh:

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

Có một số tùy chọn tùy chỉnh:

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

Họ có một dự án mẫu và đang cung cấp một số ví dụ tích hợp:

Nếu bạn đã truy cập vào liên kết, bạn sẽ thấy rằng tôi chỉ sao chép và dán mã từ git README. Nếu không, hãy truy cập vào đó để có thêm một số thông tin chi tiết và ví dụ về mã.


3
Giúp đỡ rất nhiều. Tôi đã dành hơn một ngày để cố gắng nhập Zxing từ một dự án khác và chẳng đi đến đâu. Sau đó, tôi tìm thấy liên kết này và BAM nó đã hoàn tất. Chỉ cần làm theo ví dụ mã như trên từ liên kết này: github.com/zxing/zxing/wiki/Scanning-Via-Intent .
Jack BeNimble

1
Mã hoạt động !! Tôi có một vấn đề, tôi muốn máy quét dọc và cần phải thêm bố cục tùy chỉnh cho màn hình quét Có ai có thể cho tôi biết cách đạt được không ??
Harsh Trivedi

2
Để thay đổi hướng, hãy tạo một Hoạt động mới mở rộng CaptureActivity và chỉ định hướng trong AndroidManifest.xml của bạn.
ChaturaM

Khi thử chạy ứng dụng của tôi bằng ContinuousCapture trong Fragment: Lỗi: Thực thi không thành công cho tác vụ ': app :formationClassesWithDexForDebug'. > com.android.build.transform.api.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Xử lý 'lệnh' C: \ Program Files \ Java \ jdk1.8.0 _60 \ bin \ java.exe '' kết thúc với-zero không lối ra giá trị 2
Konstantin Konopko

1
@Janpan; có nó không!
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'
}

7

Bất kỳ ai gặp phải vấn đề tương tự, hãy làm theo các bước đơn giản:

Nhập dự án androidtừ zxing-mastertệp zip đã tải xuống bằng cách sử dụng tùy chọn Import project (Eclipse ADT, Gradle, etc.)và thêm 2 dòng mã theo sau vào build.gradletệp cấp ứng dụng của bạn và bạn đã sẵn sàng chạy.

Thật đơn giản, 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'

    }

Bạn luôn có thể tìm thấy phiên bản mới nhất coreandroid coretừ các liên kết bên dưới:

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

CẬP NHẬT (29.05.2019)

Thay vào đó hãy thêm các phần phụ thuộc này:

dependencies {
    implementation 'com.google.zxing:core:3.4.0'
    implementation 'com.google.zxing:android-core:3.3.0'
}

Câu trả lời đơn giản của Perefct :) Sau nhiều nghiên cứu và phát triển, tôi đã tìm thấy liên kết này, và có vẻ như một phép thuật đã xảy ra.
Ramkesh Yadav

1
hiện tại Phiên bản mới nhất Core và Android Core là các phụ thuộc {// mvnrepository.com/artifact/com.google.zxing/core nhóm triển khai: 'com.google.zxing', name: 'core', phiên bản: '3.3.2' / / mvnrepository.com/artifact/com.google.zxing/android-core nhóm triển khai: 'com.google.zxing', name: 'android-core', phiên bản: '3.3.0'}
Ramkesh Yadav

tôi muốn hợp nhất nó trong dự án đã được thực hiện và không muốn nhập như một dự án mới, vậy làm cách nào để đạt được điều này? yêu cầu trợ giúp khẩn cấp :)
Ramkesh Yadav

Cảm ơn! Tôi cũng phải nhập dự án và thêm các phụ thuộc.
CoolMind 21/09/18

0

Từ phiên bản 4.x, chỉ Android SDK 24+ được hỗ trợ theo mặc định và androidx là bắt buộc.

Thêm phần sau vào tệp build.gradle của bạn:

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
}

Các phiên bản SDK cũ hơn

Đối với các phiên bản SDK Android <24, bạn có thể hạ cấp zxing: core xuống 3.3.0 hoặc cũ hơn để hỗ trợ 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'
}

Bạn cũng sẽ cần điều này trong tệp kê khai Android của mình:

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

Nguồn: https://github.com/journeyapps/zxing-android-embedded


-1

hướng dẫn này giúp tôi tích hợp với studio android: http://wahidgazzah.olympe.in/integrating-zxing-in-your-android-app-as-standalone-scanner/ nếu không thử NÀY

chỉ cần thêm vào 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>

Hy vọng điều này giúp đỡ!.


14
cả hai liên kết là 404
prgmrDev

Điều đó không giúp được gì
deepakgates

@deepakgates: lỗi thời, bạn có thể mang theo một số mã để kiểm tra?
hirigoshy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.