Android Studio에 ZXing 통합


93

내가 한 모든 단계를 설명하기 시작하고 결국 문제가 무엇인지 설명하겠습니다.

  1. ZXing-2.2 다운로드 https://code.google.com/p/zxing/downloads/list
  2. 모든 zxing-2.2의 Extrac.
  3. Apache Ant http://www.youtube.com/watch?v=XJmndRfb1TU 다운로드 및 설치
  4. Windows 명령 줄 (실행-> CMD)을 사용하여 추출 된 디렉터리로 이동합니다.
  5. 명령 줄 창에서- 'ant -f core / build.xml'을 입력하고 Enter 키를 누르고 Apache가 마술처럼 작동하도록합니다.

지금은 ZXing 라이브러리를 Android 애플리케이션에 직접 통합하는 것과 같습니다.

그러나 Wooops, "Buildfile : core \ build.xml이 존재하지 않습니다! 빌드에 실패했습니다. 좋습니다. 6. ZXing 가져 오기-core / build.xml 누락

이제 예, core.jar이 있습니다.

  1. Android Studio, File-> Import Project-> Select / android / in /zxing-2.2/-> Create project from existing sources-> Project name : andoid-> Source files for ... all selected Next-> Libraries (cant 아무것도하지 않음) 다음-> 모듈 (안드로이드 확인) 다음-> SDK 1.7 다음-> 마침

프로젝트 열기-> 빌드-> 프로젝트 다시 빌드

100 개 오류 19 개 경고

파일-> 프로젝트 구조-> 라이브러리-> 추가-> Java-> 이전에 만든 core.jar을 선택하면 확인-> 라이브러리 'core'가 선택한 모듈에 추가됩니다. (android) OK-> 프로젝트 구조 대화 상자에서 OK.

빌드-> 프로젝트 다시 빌드

15 개 오류 20 개 경고

모든 오류는 오류입니다. 상수 표현식이 필요하고 Android에서 ZXing 프로젝트의 Switch 케이스에서 오류가 표시 됩니다. 다른 경우 모든 스위치를 변경합니다.

0 오류 20 경고

이제 계속합니다.

파일-> 새 프로젝트-> zxing_demo 다음-> 다음-> 빈 활동 다음-> 완료

새 프로젝트에서-> 파일-> 모듈 가져 오기-> 검색 및 선택 / android / 확인-> 기존 소스에서 모듈 만들기 다음-> 다음-> 다음-> 다음-> 마침

이제 탐색기 / android / / zging_demoProject / 및 외부 라이브러리에서 볼 수 있습니다.

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

}

이제 테스트, 실행-> 디버그

그리고 충돌.

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

이 줄의 AndroidManifest.xml에서 볼 수 있습니다.

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

빨간색의 "CaptureActivity"및 오류 메시지 : 'CaptureActivity'기호를 해결할 수 없음

파일-> 프로젝트 구조-> 모듈-> zxing_demo-> 종속성-> 추가-> 모듈 종속성-> Android 확인-> 적용 및 확인

이제 CaptureActivity가 좋아 보입니다.

다시 디버그

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

나는 응용 프로그램과 의도를 사용할 것이라고 생각하지만 지금은이 작업을 원합니다.


이 질문은 많은 견해를 가지고 있으므로 누군가에게 도움이되는 경우를 대비하여 [여기 내 비슷한 문제가 있습니다] [1] [1] : stackoverflow.com/questions/20334572/…
Daniel Wilson

답변:


234

ZXING을 Android 애플리케이션에 통합하고 있었는데 입력을위한 좋은 소스가 없었습니다. 저에게 도움이되었던 방법에 대한 힌트를 드릴 것입니다. 왜냐하면 매우 쉬웠 기 때문 입니다.

zxing안드로이드 라이브러리 프로젝트를 AAR 아카이브로 제공하는 정말 편리한 git 저장소가 있습니다.

여러분이해야 할 일은 이것을 build.gradle에 추가하는 것입니다.

repositories {
    jcenter()
}

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

그리고 Gradle은 코드를 컴파일하고 앱에서 액세스 할 수 있도록 모든 마법을 수행합니다.

나중에 스캐너를 시작하려면 다음 클래스 / 방법을 사용하십시오. 활동에서 :

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

조각에서 :

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

몇 가지 사용자 지정 옵션이 있습니다.

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

그들은이 샘플 프로젝트를 여러 통합 예제를 제공하고 있습니다 :

이미 링크를 방문했다면 git README에서 코드를 복사하여 붙여 넣은 것을 볼 수 있습니다. 그렇지 않은 경우 거기로 이동하여 더 많은 통찰력과 코드 예제를 얻으십시오.


3
큰 도움. 다른 프로젝트에서 Zxing을 가져 오려고 하루를 보냈지 만 아무데도 가지 않았습니다. 그런 다음이 링크를 찾았고 BAM 이 완료되었습니다. 이 링크에서 위의 코드 예제를 따르십시오 : github.com/zxing/zxing/wiki/Scanning-Via-Intent .
잭 BeNimble

1
코드 작동 !! 한 가지 문제가 있습니다. 스캐너 초상화를 원하고 스캔 화면에 대한 사용자 정의 레이아웃을 추가해야합니다. 누구든지 달성하는 방법을 알려줄 수 있습니까?
Harsh Trivedi

2
방향을 변경하려면 CaptureActivity를 확장하는 새 활동을 만들고 AndroidManifest.xml에서 방향을 지정합니다.
ChaturaM

Fragment에서 ContinuousCapture를 사용하여 내 앱을 실행하려고 할 때 ': 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 \ 빈 \ java.exe를 '0이 아닌 종료 값이 완료
콘스탄틴 Konopko

1
@Janpan; 네 그렇습니다!
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

같은 문제에 직면 한 사람은 누구나 간단한 단계를 따르십시오.

옵션을 사용하여 android다운로드 한 zxing-masterzip 파일 에서 프로젝트 를 가져 Import project (Eclipse ADT, Gradle, etc.)오고 앱 레벨 build.gradle파일 에 두 줄의 코드를 추가하면 실행할 준비가 된 것입니다.

너무 간단하네요 ...

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'

    }

항상 최신 버전 coreandroid core아래 링크에서 찾을 수 있습니다 .

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

업데이트 (2019.05.29)

대신 다음 종속성을 추가하십시오.

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

Perefct 간단한 대답 :) 많은 R & D 후에 나는이 링크를 찾았고 마술이 일어난 것처럼 보입니다.
Ramkesh Yadav

1
이제 최신 버전 Core 및 Android Core는 종속성 {// mvnrepository.com/artifact/com.google.zxing/core 구현 그룹 : 'com.google.zxing', 이름 : 'core', 버전 : '3.3.2'/ / mvnrepository.com/artifact/com.google.zxing/android-core 구현 그룹 : 'com.google.zxing', 이름 : 'android-core', 버전 : '3.3.0'}
Ramkesh Yadav

새 프로젝트로 가져오고 싶지 않은 이미 만든 프로젝트에서 이것을 병합하고 싶습니다. 어떻게 이것을 얻을 수 있습니까? 긴급한 도움이 :) 필요
Ramkesh 야다 브에게

감사! 또한 프로젝트를 가져오고 종속성을 추가해야했습니다.
CoolMind

0

버전 4.x부터는 Android SDK 24+ 만 기본적으로 지원되며 androidx가 필요합니다.

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
}

이전 SDK 버전

Android SDK 버전이 24 미만인 경우 Android 14 이상 지원을 위해 zxing : core를 3.3.0 이하로 다운 그레이드 할 수 있습니다.

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

Android 매니페스트에도 다음이 필요합니다.

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

출처 : https://github.com/journeyapps/zxing-android-embedded


-1

이 튜토리얼 도움 나 안드로이드 스튜디오에 통합 할 수 : http://wahidgazzah.olympe.in/integrating-zxing-in-your-android-app-as-standalone-scanner/ 다운 시도하는 경우에 본을

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>

이 도움을 바랍니다!.


14
두 링크 모두 404
prgmrDev

그것은 도움이되지 않았다
deepakgates

@deepakgates : 구식입니다. 확인할 코드를 가져올 수 있습니까?
hirigoshy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.