Android | Intentlerle ZXing/Barcode Scanner kullanma

Written by Super User. Posted in Android Anlatımlar

Önceki makalelerimizden birisi olan Android | ZXing Kütüphanesini Android Uygulamasına Entegre Etme makalesinde uygulamamızda Barcode Scanner kullanabilmek için ZXing kütüphanesini uygulamamıza nasıl dahil edebileceğimizden bahsetmiştim.

Genel olarak uygulamamızda Barcode Scanner kullanabilmemizin 2 temel yöntemi mevcut. Bunlardan birtanesi yukarıda linkini verdiğim makalede bahsettiğim, kütüphaneyi direk kullanmak, bir diğeri ise bize sunulan bir kaç sınıf yardımıyla uygulamamızda Barkod Scanner uygulamasına erişip, ondan gelen veriyi işlemek. İlk yöntem biraz daha uğraşlı ve karmaşık bir iş tabi ki, bu makalemde bahsedeceğim yöntem ise, daha basit ve anlaşılır bir işlem. Tek yapmamız gereken, kullanıcıya Barcode Scanner uygulamasını kurması için bir zorlama yapmak oluyor. Barcode Scanner uygulaması bizim istediğimiz işlevi yerine getiriyor ve bize istediğimiz veriyi gönderiyor, bu sayede dönen veriyi işleyebiliyoruz.

Intentler yardımıyla Barcode Scanner'ı uygulamamızla haberleştirip, dönen veriyi işleyebilmemiz için 2 tane sınıfa ihtiyacımız var. Bu sınıflardan bir tanesiIntentIntegrator.java bir diğeri ise IntentResult.java. Bu sınıflara link 'ten erişip indirebilirsiniz.

IntentIntegrator.java sınıfını incelediğinizde göreceksiniz ki, bu sınıf barkod tarama işlemini başlatmak, Barcode Scanner programı yoksa kullanıcıyı bunu kurmaya zorlamak, sonucu döndürmek gibi işlemlerin hepsini IntentResult sınıfıyla beraber hallediyor. Bu nedenle bizim yapmamız gereken sadece bu sınıfların fonksiyonlarını doğru yerlerde kullanabilmek.

Şimdi bu sınıfların kullanımını kodlarla inceleyelim;

Bizim barkoddugme isimli bir buttonumuz var. Bu button'umuza tıklandığı zaman eğer Barcode Scanner uygulaması aygıtımızda yüklüyse direk BarcodeScannerın etkinleşip taramaya başlaması, yoksa kullanıcıya bir AlertDialog ile bu uygulamayı yüklemek isteyip istemediğini sormasını istiyoruz. Bu nedenle initiateScan metoduna koddaki overload edilmiş şekliyle erişiyoruz. Biz eğer  initiateScan fonksiyonundaki string argumanları girmeseydik, fonksiyon default olarak tanımlanmış İngilizce cümlelerle AlertDialog'u oluşturacaktı.

Button barkoddugme = (Button) this.findViewById(R.id.barkodile);

barkoddugme.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
IntentIntegrator.initiateScan(BarkodTanimla.this,"Barcode Scanner yükleme onayı?","Otomatik barkod tanıma Barcode Scanner'a ihtiyaç duyuyor. Kurulsun mu?","Evet","Hayır");
}
});

Evet, buttonumuza tıklandığında artık IntentIntegrator sınıfının initiateScan fonksiyonu çalışacak ve bizim için yukarda belirttiğim işlevleri gerçekleştirecek. Ama sanki bu aşamadan sonra yapmamız gereken bir şey daha var. Taranan barkod sonucunda elde edilen veriyi işlemek. Bunun için ise alttaki fonksiyon devreye giriyor. IntentResult.java sınıfını kullandığımız fonksiyon ise bu fonksiyondur.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case IntentIntegrator.REQUEST_CODE: {
if (resultCode != RESULT_CANCELED) {
IntentResult scanResult = IntentIntegrator.parseActivityResult(
requestCode, resultCode, data);
if (scanResult != null) {
String contents = scanResult.getContents();
Intent i = new Intent(this, Sonuc.class);
Bundle bundle = new Bundle();
bundle.putString("contents", contents);
i.putExtras(bundle);
startActivity(i);
}
}
break;
}
}
}

Bu fonksiyon ilede scanResult'ımız varsa Sonuc.class'ımıza bir Bundle içerisinde okunan barkodumuzu gönderiyoruz. Artık yapmamız gereken tek şey olarak Sonuc.class içerisinden gönderilen barkodumuzu yakalamak kalıyor. Bunu ise, o sınıfımızdan alttaki kod ile yapıyoruz.

Bundle extras = getIntent().getExtras();
String gelenbarkod = extras.getString("contents");

Artık okunan barkodumuzu bu sınıfta istediğimiz gibi kullanabiliriz.