ZXing kütüphanesini doğrudan Android uygulamama entegre etme


141

Bunu sadece çaresizlik içinde yazıyorum :) Bir Android 1.6 telefona bağımsız bir barkod tarayıcı (konsept kanıtı olarak) yapmak için görevlendirildim.

Bunun için ZXing kütüphanesini keşfettim.

Ben googled, StackOverflow ilgili sence kullanılan ilgili konuları burada okuyun vb. Hiçbir şey yardımcı olmuş gibi görünmüyordu ve bu mentale ablukada bir delik açamıyorum: /

Bunun mümkün olduğunu, lib'i kullanmanın ve kendi bağımsız barkod tarayıcınızı oluşturmanın mümkün olduğunu biliyorum. Zxing millet tarafından sağlanan "Barkod Tarayıcı" kullanarak, (Intent üzerinden) çok kolay bir çözüm olduğunu okudum. Ne yazık ki bu bir seçenek değil ve bağımsız bir uygulama isteniyor.

Benim problemimi özetlemek gerekirse:

  1. Eclipse aracılığıyla ZXing kaynak lib'i Android Kod projeme nasıl entegre edebilirim?
  2. Entegre edildiğinde ... tarama işlevini "yüklemek" için lib nasıl kullanılır?
  3. Eclipse'de yeni çalışmaya başladığım için adım adım rehber neredeyse tercih ediliyor.

Kod projemi ZXing kaynak klasöründen Android klasörüne bağımlı hale getirmeye çalıştım. Bunu yaptığımda, çoğunlukla 'org.apache' (??) ile ilgili bir avuç hatası ortaya çıkıyor.

Bunu anlayamıyorum ... bu yüzden birkaç ipucu en yararlı olur.

Şimdiden teşekkür ederim :)


Yapmak istediğiniz şeyin burada olduğuna inanıyorum: stackoverflow.com/questions/4854442/…
Danny Remington - OMS

ZXing bir barkodu okumanın tek yolu değildir. 2016 itibarıyla Android Barkod API'sını kullanmak çok daha kolay .
Dan Dascalescu

Yanıtlar:


127

GÜNCELLEME! - ÇÖZÜLMÜŞ + REHBER

Ben anlamaya başladım :) Ve aşağıda adım adım kılavuzu okuyabilirsiniz, bu yüzden umarım sahip olduğum problemle başkalarına yardımcı olabilir;)

  1. Apache Ant'i yükleyin - ( Yapılandırma yardımı için bu YouTube videosuna bakın )
  2. ZXing kaynağını ZXing ana sayfasından indirin ve çıkarın
  3. Windows Komut Satırı (Run-> CMD) kullanarak indirilenin kök dizinine gidin zxing src.
  4. Komut satırı penceresinde - ant -f core/build.xmlenter tuşuna basın ve Apache'nin sihirli çalışmasına izin verin [ sorun mu yaşıyorsunuz? ]
  5. Eclipse -> yeni Android Project'e girin, yeni çıkardığınız dizindeki android klasörüne göre
  6. Proje klasörünü sağ tıklayın -> Özellikler -> Java Derleme Yolu -> Kütüphane -> Harici JAR Ekle ...
  7. Yeni çıkarılan klasöre gidin ve çekirdek dizini açın ve seçin core.jar... enter enter!

Şimdi çevirilerde ve AndroidManifest.xml dosyasında birkaç hatayı düzeltmeniz gerekiyor :) Şimdi mutlu bir şekilde derleyebilirsiniz ve şimdi ZXing kaynağına dayalı çalışan bağımsız bir barkod tarayıcı uygulaması olacak;)

Mutlu kodlama çocuklar - Umarım başkalarına yardımcı olabilir :)


Harika bir yazı! AndroidManifest.xmlDosyada düzenledikleriniz hakkında biraz ayrıntı ekleyebilir misiniz ? İncelemeden sonra bu dosyada herhangi bir hata görmüyorum. Teşekkürler!
Brian Armstrong

7
AndroidManifest.xml dosyasında veya çevirilerde hata yok. Bununla birlikte, en son Android SDK'sında uyumluluk sorunları var. Bunu kullanırsanız, SVN'nin daha sonraki kaynak kodunu kullanmanız gerekir.
Sean Owen

Merhaba, herhangi bir QR Droid veya Barkod Tarayıcı uygulaması kullanmadan bağımsız bir uygulama olarak QR taraması için başka bir uygulama geliştirmeye çalışıyordum. Bunu yapmak için bahsettiğiniz adımlar mı yoksa hala başka bir uygulamayı niyetler veya herhangi bir şey aracılığıyla mı kullanıyorsunuz?
kumar

1
Code.google.com/p/zxing/downloads/list adresindeki zip paketi "çekirdek" dizinin yanı sıra "android" ve "android-entegrasyonu" da içerir. "Çekirdek" kullanmanızın nedeni nedir?
Michał K

1
Pekala, şimdi nedenini biliyorum. Birisi de merak ederse, lütfen stackoverflow.com/questions/4854442/…
Michał K

83

Üçüncü taraf uygulamayı yüklemeye gerek kalmadan ZXing kitaplığını kullanarak QR kodunun nasıl oluşturulacağı ve görüntüleneceği ile ilgili adım adım bir kılavuz. Not: ZXing'i ANT veya başka bir oluşturma aracıyla oluşturmanız gerekmez. Dosya core.jar, yayınlanan zip arşivinde bulunur (aşağıyı okuyun).

  1. ZXing'in en son sürümünü indirin . - ( ZXing-*.zip)
  2. Bu zip arşivini çıkarın ve dizin core.jaraltında bulun core/.
  3. Eğer Eclipse IDE, sürükle ve bırak kullanıyorsanız core.jariçin libsAndroid projesinin dizinine. Sorulduğunda, Kopyala'yı seçin .
  4. Aşağıda verilen iki sınıfı ( Contents.java& QRCodeEncoder.java) Android projenizin ana paketine kopyalayın .
  5. Oluşturduğunuz bir ImageViewEtkinliğinizde, oluşturulan QR kodunu görüntülemek için henüz yoksa öğe oluşturun. Aşağıda bir örnek verilmiştir:
  6. QR kodunu Bitmap biçiminde oluşturmak ve bir ImageView.

ImageViewEtkinlik düzeni XML dosyanıza eklenecek bir öğe:

<ImageView 
    android:id="@+id/qrCode"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="50dp"
    android:layout_centerHorizontal="true"/>

Kod snippet'i:

// ImageView to display the QR code in.  This should be defined in 
// your Activity's XML layout file
ImageView imageView = (ImageView) findViewById(R.id.qrCode);

String qrData = "Data I want to encode in QR code";
int qrCodeDimention = 500;

QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(qrData, null,
        Contents.Type.TEXT, BarcodeFormat.QR_CODE.toString(), qrCodeDimention);

try {
    Bitmap bitmap = qrCodeEncoder.encodeAsBitmap();
    imageView.setImageBitmap(bitmap);
} catch (WriterException e) {
    e.printStackTrace();
}

Burada Contents.java

//
// * Copyright (C) 2008 ZXing authors
// * 
// * Licensed under the Apache License, Version 2.0 (the "License");
// * you may not use this file except in compliance with the License.
// * You may obtain a copy of the License at
// * 
// * http://www.apache.org/licenses/LICENSE-2.0
// * 
// * Unless required by applicable law or agreed to in writing, software
// * distributed under the License is distributed on an "AS IS" BASIS,
// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// * See the License for the specific language governing permissions and
// * limitations under the License.
// 

import android.provider.ContactsContract;

public final class Contents {
    private Contents() {
    }

    public static final class Type {

     // Plain text. Use Intent.putExtra(DATA, string). This can be used for URLs too, but string
     // must include "http://" or "https://".
        public static final String TEXT = "TEXT_TYPE";

        // An email type. Use Intent.putExtra(DATA, string) where string is the email address.
        public static final String EMAIL = "EMAIL_TYPE";

        // Use Intent.putExtra(DATA, string) where string is the phone number to call.
        public static final String PHONE = "PHONE_TYPE";

        // An SMS type. Use Intent.putExtra(DATA, string) where string is the number to SMS.
        public static final String SMS = "SMS_TYPE";

        public static final String CONTACT = "CONTACT_TYPE";

        public static final String LOCATION = "LOCATION_TYPE";

        private Type() {
        }
    }

    public static final String URL_KEY = "URL_KEY";

    public static final String NOTE_KEY = "NOTE_KEY";

    // When using Type.CONTACT, these arrays provide the keys for adding or retrieving multiple phone numbers and addresses.
    public static final String[] PHONE_KEYS = {
            ContactsContract.Intents.Insert.PHONE, ContactsContract.Intents.Insert.SECONDARY_PHONE,
            ContactsContract.Intents.Insert.TERTIARY_PHONE
    };

    public static final String[] PHONE_TYPE_KEYS = {
            ContactsContract.Intents.Insert.PHONE_TYPE,
            ContactsContract.Intents.Insert.SECONDARY_PHONE_TYPE,
            ContactsContract.Intents.Insert.TERTIARY_PHONE_TYPE
    };

    public static final String[] EMAIL_KEYS = {
            ContactsContract.Intents.Insert.EMAIL, ContactsContract.Intents.Insert.SECONDARY_EMAIL,
            ContactsContract.Intents.Insert.TERTIARY_EMAIL
    };

    public static final String[] EMAIL_TYPE_KEYS = {
            ContactsContract.Intents.Insert.EMAIL_TYPE,
            ContactsContract.Intents.Insert.SECONDARY_EMAIL_TYPE,
            ContactsContract.Intents.Insert.TERTIARY_EMAIL_TYPE
    };
}

Ve QRCodeEncoder.java

/*
 * Copyright (C) 2008 ZXing authors
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import android.provider.ContactsContract;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.telephony.PhoneNumberUtils;

import java.util.Collection;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.Map;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;

public final class QRCodeEncoder {
    private static final int WHITE = 0xFFFFFFFF;
    private static final int BLACK = 0xFF000000;

    private int dimension = Integer.MIN_VALUE;
    private String contents = null;
    private String displayContents = null;
    private String title = null;
    private BarcodeFormat format = null;
    private boolean encoded = false;

    public QRCodeEncoder(String data, Bundle bundle, String type, String format, int dimension) {
        this.dimension = dimension;
        encoded = encodeContents(data, bundle, type, format);
    }

    public String getContents() {
        return contents;
    }

    public String getDisplayContents() {
        return displayContents;
    }

    public String getTitle() {
        return title;
    }

    private boolean encodeContents(String data, Bundle bundle, String type, String formatString) {
        // Default to QR_CODE if no format given.
        format = null;
        if (formatString != null) {
            try {
                format = BarcodeFormat.valueOf(formatString);
            } catch (IllegalArgumentException iae) {
                // Ignore it then
            }
        }
        if (format == null || format == BarcodeFormat.QR_CODE) {
            this.format = BarcodeFormat.QR_CODE;
            encodeQRCodeContents(data, bundle, type);
        } else if (data != null && data.length() > 0) {
            contents = data;
            displayContents = data;
            title = "Text";
        }
        return contents != null && contents.length() > 0;
    }

    private void encodeQRCodeContents(String data, Bundle bundle, String type) {
        if (type.equals(Contents.Type.TEXT)) {
            if (data != null && data.length() > 0) {
                contents = data;
                displayContents = data;
                title = "Text";
            }
        } else if (type.equals(Contents.Type.EMAIL)) {
            data = trim(data);
            if (data != null) {
                contents = "mailto:" + data;
                displayContents = data;
                title = "E-Mail";
            }
        } else if (type.equals(Contents.Type.PHONE)) {
            data = trim(data);
            if (data != null) {
                contents = "tel:" + data;
                displayContents = PhoneNumberUtils.formatNumber(data);
                title = "Phone";
            }
        } else if (type.equals(Contents.Type.SMS)) {
            data = trim(data);
            if (data != null) {
                contents = "sms:" + data;
                displayContents = PhoneNumberUtils.formatNumber(data);
                title = "SMS";
            }
        } else if (type.equals(Contents.Type.CONTACT)) {
            if (bundle != null) {
                StringBuilder newContents = new StringBuilder(100);
                StringBuilder newDisplayContents = new StringBuilder(100);

                newContents.append("MECARD:");

                String name = trim(bundle.getString(ContactsContract.Intents.Insert.NAME));
                if (name != null) {
                    newContents.append("N:").append(escapeMECARD(name)).append(';');
                    newDisplayContents.append(name);
                }

                String address = trim(bundle.getString(ContactsContract.Intents.Insert.POSTAL));
                if (address != null) {
                    newContents.append("ADR:").append(escapeMECARD(address)).append(';');
                    newDisplayContents.append('\n').append(address);
                }

                Collection<String> uniquePhones = new HashSet<String>(Contents.PHONE_KEYS.length);
                for (int x = 0; x < Contents.PHONE_KEYS.length; x++) {
                    String phone = trim(bundle.getString(Contents.PHONE_KEYS[x]));
                    if (phone != null) {
                        uniquePhones.add(phone);
                    }
                }
                for (String phone : uniquePhones) {
                    newContents.append("TEL:").append(escapeMECARD(phone)).append(';');
                    newDisplayContents.append('\n').append(PhoneNumberUtils.formatNumber(phone));
                }

                Collection<String> uniqueEmails = new HashSet<String>(Contents.EMAIL_KEYS.length);
                for (int x = 0; x < Contents.EMAIL_KEYS.length; x++) {
                    String email = trim(bundle.getString(Contents.EMAIL_KEYS[x]));
                    if (email != null) {
                        uniqueEmails.add(email);
                    }
                }
                for (String email : uniqueEmails) {
                    newContents.append("EMAIL:").append(escapeMECARD(email)).append(';');
                    newDisplayContents.append('\n').append(email);
                }

                String url = trim(bundle.getString(Contents.URL_KEY));
                if (url != null) {
                    // escapeMECARD(url) -> wrong escape e.g. http\://zxing.google.com
                    newContents.append("URL:").append(url).append(';');
                    newDisplayContents.append('\n').append(url);
                }

                String note = trim(bundle.getString(Contents.NOTE_KEY));
                if (note != null) {
                    newContents.append("NOTE:").append(escapeMECARD(note)).append(';');
                    newDisplayContents.append('\n').append(note);
                }

                // Make sure we've encoded at least one field.
                if (newDisplayContents.length() > 0) {
                    newContents.append(';');
                    contents = newContents.toString();
                    displayContents = newDisplayContents.toString();
                    title = "Contact";
                } else {
                    contents = null;
                    displayContents = null;
                }

            }
        } else if (type.equals(Contents.Type.LOCATION)) {
            if (bundle != null) {
                // These must use Bundle.getFloat(), not getDouble(), it's part of the API.
                float latitude = bundle.getFloat("LAT", Float.MAX_VALUE);
                float longitude = bundle.getFloat("LONG", Float.MAX_VALUE);
                if (latitude != Float.MAX_VALUE && longitude != Float.MAX_VALUE) {
                    contents = "geo:" + latitude + ',' + longitude;
                    displayContents = latitude + "," + longitude;
                    title = "Location";
                }
            }
        }
    }

    public Bitmap encodeAsBitmap() throws WriterException {
        if (!encoded) return null;

        Map<EncodeHintType, Object> hints = null;
        String encoding = guessAppropriateEncoding(contents);
        if (encoding != null) {
            hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class);
            hints.put(EncodeHintType.CHARACTER_SET, encoding);
        }
        MultiFormatWriter writer = new MultiFormatWriter();
        BitMatrix result = writer.encode(contents, format, dimension, dimension, hints);
        int width = result.getWidth();
        int height = result.getHeight();
        int[] pixels = new int[width * height];
        // All are 0, or black, by default
        for (int y = 0; y < height; y++) {
            int offset = y * width;
            for (int x = 0; x < width; x++) {
                pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
            }
        }

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        return bitmap;
    }

    private static String guessAppropriateEncoding(CharSequence contents) {
        // Very crude at the moment
        for (int i = 0; i < contents.length(); i++) {
            if (contents.charAt(i) > 0xFF) { return "UTF-8"; }
        }
        return null;
    }

    private static String trim(String s) {
        if (s == null) { return null; }
        String result = s.trim();
        return result.length() == 0 ? null : result;
    }

    private static String escapeMECARD(String input) {
        if (input == null || (input.indexOf(':') < 0 && input.indexOf(';') < 0)) { return input; }
        int length = input.length();
        StringBuilder result = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            char c = input.charAt(i);
            if (c == ':' || c == ';') {
                result.append('\\');
            }
            result.append(c);
        }
        return result.toString();
    }
}

13
En son ZXing'in bir nedeni vardır. Bunun için 2.1 indirmem gerekiyordu.
capcom

12
core.jar, Maven sürüm deposunda ayrı olarak mevcuttur, 2.2 sürümü için bağlantı repo1.maven.org/maven2/com/google/zxing/core/2.2/core-2.2.jar
Nantoka


1
Eğer değiştirilmemişse encodeAsBitmap () yönteminiz null döndürür veya null döndüren satırı yorumlarsam NullPointerException ile başarısız olur. Bu kütüphanede yeniyim. Neyi yanlış yapıyorum?
KG6ZVP

2
@Wesam, Gerçekten yardımcı oldu. Ama u da tersi yapılabilir kodu, sağlayabilir. Yani, QR kodunu tekrar String'e dönüştürmek mi?
Shaon Hasan

15

compile 'com.google.zxing:core:2.3.0'

maalesef benim için çalışmadı.

Benim için işe yarayan buydu:

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

Lütfen bağlantıyı burada bulabilirsiniz: https://github.com/journeyapps/zxing-android-embedded


1
Bu cevap buradaki diğer cevaplar tarafından cüce. Çoğu ekran görüntüleri ve benzeri. Bu gerçekten işe yarayan tek cevap bu bir utanç! Buna dikkat et. Bahsetmediği şey bağlantılı proje, birinin bu zor kütüphaneyi kullanımı kolay (ve aslında kolay) bir kütüphaneye dönüştürdüğü bir daldır. Sadece çekirdek kavanoz normal ZXING projesinden indirin ve gitmek için iyidir. Hatta örnekleri var !!!!
StarWind0

1
Keşke daha fazla oy verebilseydim. Yıllar boyunca bunu farklı projelerde kaç farklı kez çözmeye çalıştığım hakkında hiçbir fikrin yok.
StarWind0

1
Çocuklar için mutluyum :)
Karoly

11

ANT ile derleme yaparken sorun mu yaşıyorsunuz? Okumaya devam et

Eğer ant -f core/build.xml böyle bir şey diyor:

Unable to locate tools.jar. Expected to find it in
C:\Program Files\Java\jre6\lib\tools.jar

ardından JAVA_HOMEortam değişkeninizi uygun java klasörüne ayarlayın. (Windows için) içinde tools.jar buldum:

C:\Program Files\Java\jdk1.6.0_21\lib

bu yüzden ben JAVA_HOME:

C:\Progra~1\Java\jdk1.6.0_25

bazı sitelerde bulduğum kısa sözdiziminin nedeni:

"Yol adında boşluk içermeyen bir kurulum dizini seçmeniz önemle tavsiye edilir (örn. C: \ Program Files içine KURMAYIN). Java böyle bir dizine kuruluysa, JAVA_HOME'u ayarlamak çok önemlidir ortam değişkeni boşluk içermeyen bir yola (örneğin, C: \ Progra ~ 1); bunun yapılmaması, JAVA_HOME'un değerine bağlı olan bazı programlar tarafından yapılan istisnalara neden olur. "

Daha sonra cmd'yi yeniden başlattım (önemli çünkü DOS kabuğu başlatmadan sonra env değişkenlerini okur, bu yüzden bir env değişkenini değiştirmek güncellenmiş değeri almak için yeni bir kabuk kullanmanızı gerektirir)

ve sonunda ant -f core/build.xmlçalıştı.


11

Bazı cevaplar güncel olmadığından, kendime cevap vermek istiyorum -

ZXing kitaplığını Wiki tarafından önerildiği gibi Android uygulamanıza entegre etmek için projenize 2 Java dosyası eklemeniz gerekir:

Sonra Android Studio'da build.gradle dosyasına aşağıdaki satırı ekleyin :

dependencies {
    ....
    compile 'com.google.zxing:core:3.2.1'
}

Veya hala ADT-plugin ile Eclipse kullanıyorsanız projenizin libs alt dizinine core.jar dosyası ekleyin (burada tam ekran Windows ve tam ekran Mac ):

Windows ekran görüntüsü

Son olarak bu kodu MainActivity.java'nıza ekleyin :

public void scanQRCode(View v) {
    IntentIntegrator integrator = new IntentIntegrator(MainActivity.this);
    integrator.initiateScan(IntentIntegrator.QR_CODE_TYPES);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    IntentResult result = 
        IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
    if (result != null) {
        String contents = result.getContents();
        if (contents != null) {
            showDialog(R.string.result_succeeded, result.toString());
        } else {
            showDialog(R.string.result_failed,
                getString(R.string.result_failed_why));
        }
    }
}

private void showDialog(int title, CharSequence message) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(title);
    builder.setMessage(message);
    builder.setPositiveButton(R.string.ok_button, null);
    builder.show();
}

Ortaya çıkan uygulama, ZXing (Taramadan sonra uygulamanıza otomatik olarak dönecektir) ile Barkod Tarayıcı uygulamasını yüklemenizi ve başlatmanızı isteyecektir :

Barkod Tarayıcı uygulaması

Ayrıca, ZXing Test uygulamasını kendi uygulamanız için ilham kaynağı olarak oluşturmak ve çalıştırmak istiyorsanız:

ZXing Test uygulaması

Sonra GitHub'dan 4 Java dosyasına ihtiyacınız var :

  • BenchmarkActivity.java
  • BenchmarkAsyncTask.java
  • BenchmarkItem.java
  • ZXingTestActivity.java

Ve Maven deposundan 3 Jar dosyası :

  • core.jar
  • android-core.jar
  • android-integration.jar

(Jar dosyalarını kendiniz oluşturabilirsiniz mvn package- GitHub'dan ZXing'e bakın ve bilgisayarınıza ant ve maven araçları yükleyin).

Not: projeniz Jar dosyalarını tanımıyorsa, Proje Özellikleri'nde Java sürümünü yükseltmeniz gerekebilir:

özellikler ekran görüntüsü


2
Bu harika bir cevap!
Paresh Mayani

3
Korkarım bu sorunun noktasını kaçırdı :-( Bu nokta harici bir uygulamaya güvenmemeliydi.Bu nasıl .. harici bir uygulamanın nasıl kullanılacağını gösterir? Soru başlığına "doğrudan" bakın
StarWind0

5

Koymak

compile 'com.google.zxing:core:2.3.0' 

Gradle bağımlılıklarınıza. Bu kadar kolay. Android Studio ve Gradle derleme sistemini kullanmadan önce.


Sağ! 2015'teki gerçek çözüm bu. Btw. şu anki sürüm 3.2.0
funcoder

bu herkes için işe yaradı mı? IntentIntegrator hala bulunamadı
Karoly

IntentIntegrator.java ve IntentResult.java dosyalarını Android Studio projenize manuel olarak kopyalamalısınız .
Alexander Farber



2

Eclipse içinde zxing 3.2.1 kurulumu için adım adım

  1. " Https://github.com/zxing/zxing " adresinden zxing-master.zip dosyasını indirin
  2. Zxing-master.zip dosyasını aç, zxing-master'da "android" projesini içe aktarmak için eclipse kullan
  3. Core-3.2.1.jar dosyasını " http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/ " adresinden indirin.
  4. "Android" projesinde "libs" klasörü oluşturun ve cor-3.2.1.jar dosyasını libs klasörüne yapıştırın
  5. Projeye tıklayın: Seviyeyi 1.7'ye değiştirmek için "özellikler" -> "Java Derleyici" yi seçin. Sonra Android 4.4.2+ için "Android" değiştirmek "Proje oluşturma hedefi" tıklayın, çünkü 1.7 kullanmak Android 4.4 ile derleme gerektirir
  6. "CameraConfigurationUtils.java", "zxing-master / android / app / src / main / java / com / google / zxing / client / android / camera /" klasöründe yoksa. "Zxing-master / android-core / src / main / java / com / google / zxing / client / android / camera /" adresinden kopyalayıp projenize yapıştırabilirsiniz.
  7. Temiz ve inşa projesi. Projeniz "switch - case" hakkında hata gösteriyorsa, bunları "if - else" olarak değiştirmeniz gerekir.
  8. Tamamlandı. Temiz ve inşa projesi.
  9. Referans bağlantısı: Android barkod tarama uygulaması oluşturmak için ZXing'i kullanma

2

Bunu başarmak için tüm olası yolları denedim ve sonra JourneyApps tarafından xZing'in Minified sürümünü keşfettim. Tutulma için bunu taşıdım ve GitHub'da paylaştım.

Tutulma kullanıyorsanız bu projeyi kullanın: -

https://github.com/hiteshsahu/XZing-Barcode-Scanner-Minified-Eclipse

Studio kullanıyorsanız bu projeyi kullanın: -

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

Avantajları

  1. Uygulamanızdaki dahili Barkod tarayıcısı, playstore'u kullanarak üçüncü taraf uygulamaları yüklemek zorunda değildir.

  2. Core, Android istemcisi vb. Sadece Kavanoz gerekli com.google.zxing: core: 3.2.0 .

    http://mvnrepository.com/artifact/com.google.zxing/core/3.2.0

  3. Tonlarca paket eklemenize gerek yok , karşılaştırma için aşağıdaki resimlere bakın

Önce :-

resim açıklamasını buraya girin

Sonra: -

resim açıklamasını buraya girin

  1. En önemli kısmı, son derece özelleştirilebilir olmaları . flaş ışığı ekleyebilir, parçalı olarak kullanabilir ve yön değişimini destekleyebilirsiniz.

  2. Bu Yakalama etkinliğini barkod taraması için Cordova App'te kullanabilirsiniz.

uygulama bildirimindeki yakalama etkinliğiniz şöyle görünecektir

  <activity
            android:name="com.journeyapps.barcodescanner.CaptureActivity"
            android:clearTaskOnLaunch="true"
            android:configChanges="orientation|keyboardHidden"
            android:exported="false"
            android:screenOrientation="fullSensor"
            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>

ve eklenti böyle görünecek

public class BarcodeScanner extends CordovaPlugin {
    public static final int REQUEST_CODE = 0x0ba7c0de;

    private static final String SCAN = "scan";
    private static final String CANCELLED = "cancelled";
    private static final String FORMAT = "format";
    private static final String TEXT = "text";
    private static final String SCAN_INTENT = "com.google.zxing.client.android.SCAN";

    private static final String LOG_TAG = "BarcodeScanner";

    private CallbackContext callbackContext;

    /**
     * Constructor.
     */
    public BarcodeScanner() {


    }

    /**
     * Executes the request.
     *
     * This method is called from the WebView thread. To do a non-trivial amount of work, use:
     *     cordova.getThreadPool().execute(runnable);
     *
     * To run on the UI thread, use:
     *     cordova.getActivity().runOnUiThread(runnable);
     *
     * @param action          The action to execute.
     * @param args            The exec() arguments.
     * @param callbackContext The callback context used when calling back into JavaScript.
     * @return                Whether the action was valid.
     *
     * @sa https://github.com/apache/cordova-android/blob/master/framework/src/org/apache/cordova/CordovaPlugin.java
     */
    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
        this.callbackContext = callbackContext;
        if (action.equals(SCAN)) {
            scan(args);
        } else {
            return false;
        }
        return true;
    }

    /**
     * Starts an intent to scan and decode a barcode.
     */
    public void scan(JSONArray args) {
        Intent intentScan = new Intent(SCAN_INTENT);
        intentScan.addCategory(Intent.CATEGORY_DEFAULT);

        // add config as intent extras
        if(args.length() > 0) {

            JSONObject obj;
            JSONArray names;
            String key;
            Object value;

            for(int i=0; i<args.length(); i++) {

                try {
                    obj = args.getJSONObject(i);
                } catch(JSONException e) {
                    Log.i("CordovaLog", e.getLocalizedMessage());
                    continue;
                }

                names = obj.names();
                for(int j=0; j<names.length(); j++) {
                    try {
                        key = names.getString(j);
                        value = obj.get(key);

                        if(value instanceof Integer) {
                            intentScan.putExtra(key, (Integer)value);
                        } else if(value instanceof String) {
                            intentScan.putExtra(key, (String)value);
                        }

                    } catch(JSONException e) {
                        Log.i("CordovaLog", e.getLocalizedMessage());
                        continue;
                    }
                }
            }

        }

        // avoid calling other phonegap apps
        intentScan.setPackage(this.cordova.getActivity().getApplicationContext().getPackageName());

        this.cordova.startActivityForResult((CordovaPlugin) this, intentScan, REQUEST_CODE);
    }

    /**
     * Called when the barcode scanner intent completes.
     *
     * @param requestCode The request code originally supplied to startActivityForResult(),
     *                       allowing you to identify who this result came from.
     * @param resultCode  The integer result code returned by the child activity through its setResult().
     * @param intent      An Intent, which can return result data to the caller (various data can be attached to Intent "extras").
     */
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == REQUEST_CODE) {
            if (resultCode == Activity.RESULT_OK) {
                JSONObject obj = new JSONObject();
                try {
                    obj.put(TEXT, intent.getStringExtra("SCAN_RESULT"));
                    obj.put(FORMAT, intent.getStringExtra("SCAN_RESULT_FORMAT"));
                    obj.put(CANCELLED, false);
                } catch (JSONException e) {
                    Log.d(LOG_TAG, "JSONException "+e.getMessage());
                }
                this.callbackContext.success(obj);
            } else if (resultCode == Activity.RESULT_CANCELED) {
                this.callbackContext.success("");
            } else {
                this.callbackContext.error("Technical Problem");
            }
        }
    }
}

Mutlu Entegrasyon !!


2

Zxing çocuklar 1.7 ile bir android projesi oluşturmayı kolaylaştırdı. Eskisi kadar acı verici değil. Bu, hızlı bir şekilde android için bir zxing projesi oluşturmak isteyen herkes için hızlı bir blog.

  • Zxing kaynaklarını zxing.org'dan kontrol edin
  • Tutulmanızda bir Android projesi oluşturun
  • Main.xml dosyasını silin
  • “Src” dizinine sağ tıklayın ve içe aktar'a basın. Belirtilen sırayla aşağıdaki dizinlere göz atın. Bunları tek tek içe aktarmak için eklerken, içe aktarma sihirbazının düzenleme alanında src dizinine sahip olduğunuzdan emin olun. Ve sadece sol dizin ağacında "com" dizinini seçtiğiniz. Src seçeneğini seçmeyin.
  • çekirdek
  • android-entegrasyon
  • android
  • Android sdk sürümünüzün 9 olduğundan emin olun, daha az bir şey ve androidmanifest.xml ağlayacaktır.
  • Dillerden birinde bulunan Strings.xml, 'karakterini a / önüne koy

Zxing 1.7 için bir android projesi (20 Haziran ödeme).

http://www.4shared.com/file/bFx8Y5Ys/zXingJune2010.html ( DAHA FAZLA KULLANILAMAZ )


2

Google Play Hizmetleri (sürüm 7.8.0'dan beri ) bir barkod kod çözücü içerdiğinde neden harici bir lib kullanıyorsunuz ?


1
Google engellendiği için Çin'de Google Play hizmetlerini yükleyemezsiniz.
Xiè Jìléi

Google play hizmetlerini neyse ki yüklediyseniz, Google engellendiği için Çin'de hala kullanamazsınız.
Xiè Jìléi

2

Az önce üretilen barkodları çözen bir yöntem yazdım Bitmap.String .

Tam olarak talep edilen şeyi yapar, sadece CaptureActivity ...

Bu nedenle, android-integrationkütüphane şurada atlanabilir build.gradle:

dependencies {
    // https://mvnrepository.com/artifact/com.google.zxing
    compile('com.google.zxing:core:3.3.0')
    compile('com.google.zxing:android-core:3.3.0')
}

Aşağıdaki yöntem (bir jUnit testi içinde üretilen barkodların kodunu çözer):

import android.graphics.Bitmap;

import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.Result;

protected String decode(Bitmap bitmap) {

    MultiFormatReader reader = new MultiFormatReader();
    String barcode = null;

    int[] intArray = new int[bitmap.getWidth() * bitmap.getHeight()];
    bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
    LuminanceSource source = new RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), intArray);
    BinaryBitmap binary = new BinaryBitmap(new HybridBinarizer(source));

    try {

        Result result = reader.decode(binary);
        // BarcodeFormat format = result.getBarcodeFormat(); 
        // ResultPoint[] points = result.getResultPoints();
        // byte[] bytes = result.getRawBytes(); 
        barcode = result.getText();

    } catch (NotFoundException e) {
        e.printStackTrace();
    }
    return barcode;
}


0

Son zamanlarda hem ios hem de android'de google mobil vizyonunu kullandım. Google Barkod Taraması kullanmanızı önemle tavsiye ederim. Herhangi bir yönelim ile oldukça duyarlıdır ve işlem süresi oldukça hızlıdır. Buna Google Mobil Vizyon denir.

Barkod Tarayıcı API'si barkodları herhangi bir yönde gerçek zamanlı olarak algılar. Aynı anda farklı formatlarda birkaç barkodu tespit edebilir ve ayrıştırabilirsiniz.

https://developers.google.com/vision/

https://codelabs.developers.google.com/codelabs/bar-codes/#0


0

Çok daha kolay yaklaşım.

Yalnızca uygulama düzeyi sınıflandırma dosyanıza bağımlılık ekleyin

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

Xml dosyanızda bir düğme tanımlayın ve OnCreate () içindeki ve düğmenin OnClick dinleyicisinin içindeki Java dosyasına aşağıdaki kodu yazın

new IntentIntegrator(this).initiateScan();

Ve Java dosyasının OnCreate () yönteminden sonra aşağıdaki kodu yazın

@Override
protected 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");
            String st_scanned_result = result.getContents();
            Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();

        }
    }

}

st_scanned_resultburada tanımlanmamıştır
kelalaka

Bu, String türünde genel bir değişkendir. Taranan sonucu bu onActivtyResult () öğesinin dışında kullanmıyorsanız, u yerel olarak tanımlayabilirsiniz. Like String st_scanned_result = sonuç.getContents (); Ben plz chk güncelledik.
Tara

0

2020 GÜNCELLEME: Bunu Gradle dosyanıza eklemeniz yeterli. Mükemmel çalışıyor!

repositories {
   jcenter()
}
implementation 'me.dm7.barcodescanner:zxing:1.9.13'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.