HMS Scan Kit — Part 1

Yasin Emre Türker
Huawei Developers - Türkiye
6 min readJun 4, 2020

Günümüzde dünya üzerinde birçok mobil servis kullanılmaktadır. Bu mobil servislerin en popülerlerinden biride Huawei Mobil Servisleri’dir. HMS bünyesinde Push, Analytics, Ads, Map, Location gibi çok yararlı kitlerin yanı sıra Scan Kit’de geliştirilmiştir. “Nedir bu Scan Kit?” derseniz gelin hep beraber aşağıdaki başlıklarla bu kitimizi incelemeye başlayalım.

  1. HMS Scan Kit Nedir? Ne işe yarar? Hangi Alanlarda kullanılabilir?

Mağazalarda, marketlerde, noterlerde, eğitimde, bilet alım satımında, sağlık kuruluşlarında hatta ve hatta sokakta ki seyyar satıcılar da, kısacası neredeyse tüm kurum ve kuruluşlar da barkodlar ve barkod okuyucular kullanılmaktadır.

Bu alanlarda hakkında web sitesi linki, bilgilendirme yazısı, iletişim bilgisini not etmek veya aklınızda tutmak yerine telefonunuza yükleyeceğiniz bir uygulama sayesinde bu bilgilere hemen ulaşabilir, kaydedip dilediğiniz zaman kullanabilirsiniz. Bu perspektiften yaklaşacak olursak, uygulamanızın real dünya ile bağlantı kurmasını sağlamanın ve dijital dünyadaki bilgi paylaşımını hızlandırmanın en etkili yollarından biri QR koddur.

Bizde eğer bu tarz bir uygulama geliştirmek istiyorsak kamerası olan bir akıllı telefona, yazılımında kullanılabilecek ve tarama işlemi sağlayabilecek bir mobil servise ihtiyacımız bulunmaktadır. HMS Scan Kit’te tam bu ihtiyaca cevap vermektedir. Peki nedir bu HMS Scan Kit?

HMS Scan Kit, 1D ve 2D barkodları tarayabilen, ayrıştırabilen, girdiler neticesinden QR kodlar oluşturabilen ve uygulamalarınıza hızlı bir şekilde barkod tarama işlevleri oluşturmanıza yardımcı olan bir mobil servistir.

2. HMS Scan Kit Özellikleri Nelerdir?

Desteklenen 13 Farklı Format

1D barkodlar: EAN-8, EAN-13, UPC-A, UPC-E, Codabar, Code 39, Code 93, Code 128, and ITF

2D barkodlar: QR code, Data Matrix, PDF417, and Aztec

Gelişmiş Tanıma Özelliği

Tarama yapılan alan silindirik, bulanık, parlak veya düşük görünürlüğe sahip olsa dahi işlem gerçekleştirilir. Aynı zamanda tarama yapılan düzlem hasarlı veya tahribata uğramış bile olsa büyük ölçüde tarama başarılı bir şekilde geçekleşmektedir.

Otomatik Zoom
Otomatik yakınlaştırma özelliği ile küçük veya uzak barkodlar yakınlaştırılarak tarama performansı arttırılmıştır.

Çoklu Barkod Algılama
Aynı anda 5 barkodu işleme özelliğine sahiptir.

QR kod üretimi

Girdi ile ilgili en iyi versiyon da QR kod oluşturmayı sağlar.

3. HMS Scan Kit Projeye Nasıl Entegre Edilir?

HMS Scan kiti entegre ederken bazı yazılım gereksinimlerine ihtiyacımız bulunmaktadır. Bunlar;

  • Android Studio
  • Android 4.4 (SDK versiyon 19) veya sonrası
  • Java JDK (1.8 veya sonrası)

1- HUAWEI Tarama Kiti’ni entegre eden bir uygulamayı resmi olarak yayınlamamız için öncelikle HUAWEI HMS Core’u entegre etmemiz gerekmektedir.

HUAWEI HMS Core Entegrasyonu

a) AppGallery Connect’te oturum açalım ve uygulamalarım seçeneğini seçelim.

Açılan listeden uygulamamızı bulalım ve tıklayalım. Eğer önceden oluşturulmuş bir uygulamamız yok ise “New App” butonu ile bir uygulama kaydı oluşturalım.

b) Sırasıyla, Develop-> Overview -> App Information sekmelerine tıklayalım. Açılan pencereden “agconnect-services.json” öğesine tıklayarak indirelim.

c) İndirdiğimiz Agconnect-services.json dosyasını, Android Studio üzerinden app kök dizinine kopyalayalım.

ç) Root dizinde build.gradle dosyasını açalım. Sırasıyla, allprojects -> repositories gidelim ve HMS SDK için Maven repositories adresini yapılandıralım.

allprojects {
repositories {
google()
jcenter()
maven {url 'https://developer.huawei.com/repo/'}
}
}

d) Sırasıyla buildscript -> dependencies yapılandırmalarını ekleyelim.

buildscript {
repositories {
google()
jcenter()
maven {url 'https://developer.huawei.com/repo/'}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.1'
classpath 'com.huawei.agconnect:agcp:1.3.1.300'
}
}

e) App dizinindeki build.gradle dosyasını yapılandıralım, implementation bağımlılıkları ekleyelim. {version} yerine güncel SDK sürüm numarasını girelim. Örneğin ‘com.huawei.hms: scan: 1.1.3.301’.

dependencies{
implementation 'com.huawei.hms:scan:{version}'
}

f) App kök dizinine AppGallery Connect plug-in bağımlılığını ekleyelim.

apply plugin: 'com.huawei.agconnect'

Projeyi senkronize edelim. Senkronizasyon tamamlanana kadar bekleyelim. Bir hata oluşursa, ağ bağlantınızı ve build.gradle dosyasındaki yapılandırmaları kontrol edelim. Böylece HMS Core entegrasyonumuz tamamlamış olacağız. Bundan sonraki adımlarda HMS Scan Kit entegrasyon adımlarına geçebiliriz.

HMS Scan Kit entegrasyon

2- HMS Scan Kit için Gerekli İzinleri Ekleme

Öncelikle sdk versiyonu eski olan mobil cihazlar için kamera iznini ve dosya okuma iznini manifest dosyamıza ekleyelim.

<!--Camera permission-->
<uses-permission android:name="android.permission.CAMERA" />
<!--File reading permission-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

Sonrasında sdk versiyonu güncel olan yani “runtime permission” sürecini destekleyen mobil cihazlar içinde kamera ve dosya okuma izinlerini, kullanıcıdan alan fonksiyonları kodumuza ekleyelim.

public void newViewBtnClick(View view) {
// DEFINED_CODE is customized for receiving the permission verification result.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
this.requestPermissions(
new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE},
DEFAULT_VIEW);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (permissions == null || grantResults == null || grantResults.length < 2 || grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) {
return;
}
if (requestCode == DEFINED_CODE) {
// Display the barcode scanning view.
this.startActivityForResult(new Intent(this, DefinedActivity.class), REQUEST_CODE_SCAN);
}
}

3- HMS Scan Kit Tarama Metodlarını Ekleme

HMS Scan Kit özelliklerini iki farklı yolu izleyerek entegre edebiliriz. Bu yollardan birincisi varsayılan(default) yol iken ikincisi özelleştirilmiş(custom)denilen yoldur.

a)Birinci yola göz atalım. StartScan komutu ile tarama işlemine başlama komutu verilir. Burada tarama Kiti’nin desteklenen tüm 13 formattaki barkodları tarama yapılmasını istiyorsanız startScan metodunun 3.parametresini null olarak yazabiliriz.

ScanUtil.startScan(this, REQUEST_CODE_SCAN_ONE, null);

Sipesifik bir tarama formatı seçeneği oluşturmak istersek, 3.parametre yerine kendi oluşturduğumuz seçeneği(option) yerleştirebiliriz. “FORMAT_ALL_FORMATS” format tipi yerine farklı format tipleride seçilebilir. Bunun örneği aşağıda yer almaktadır.

HmsMLVisionScanDetectorOptions options = new HmsMLVisionScanDetectorOptions.Builder().setBarcodeFormats(HmsMLVisionScan.FORMAT_ALL_FORMATS).build();ScanUtil.startScan(BottomNavigationBarActivity.this, REQUEST_CODE_SCAN, options);

Kullanıcı bir barkodu taramak için kamerayı kullanabilir veya albümünden bir görüntüyü seçebilir. Aşağıdaki örnekte gösterilen onActivityResult metodu ile tarama sonucu elde edilir.

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode != RESULT_OK || data == null) {return;}if (requestCode == REQUEST_CODE_SCAN_ONE) {HmsScan obj = data.getParcelableExtra(ScanUtil.RESULT);if (obj != null) {// Display the decoding result.showResult(obj);

b) HMS Scan Kit yeteneğini uygulamak için özelleştirilmiş görünüm(customized view) oluşturmanın detayları için geliştirme kılavuzuna bakılabilir.

Bunların yanı sıra özelleştirilmiş kamerayı kullanarak barkod taraması yapmamız için aşağıdaki sınıfta(class) yer alması gereken kodları, kendi uygulamamızda kullanabiliriz.

// Import all dependencies suggested by Android Studio.
private RemoteView remoteView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_defined);//1.get screen density to caculate viewfinder's rect
DisplayMetrics dm = getResources().getDisplayMetrics();
float density = dm.density;
//2.get screen size
mScreenWidth = getResources().getDisplayMetrics().widthPixels;
mScreenHeight = getResources().getDisplayMetrics().heightPixels;
int scanFrameSize = (int) (SCAN_FRAME_SIZE * density);//3.caculate viewfinder's rect,it's in the middle of the layout
//set scanning area(Optional, rect can be null,If not configure,default is in the center of layout)
Rect rect = new Rect();
rect.left = mScreenWidth / 2 - scanFrameSize / 2;
rect.right = mScreenWidth / 2 + scanFrameSize / 2;
rect.top = mScreenHeight / 2 - scanFrameSize / 2;
rect.bottom = mScreenHeight / 2 + scanFrameSize / 2;
//initialize RemoteView instance, and set calling back for scanning result
remoteView = new RemoteView.Builder().setContext(this).setBoundingBox(rect).setFormat(HmsScan.ALL_SCAN_TYPE).build();
remoteView.onCreate(savedInstanceState);
remoteView.setOnResultCallback(new OnResultCallback() {
@Override
public void onResult(HmsScan[] result) {
if (result != null && result.length > 0 && result[0] != null && !TextUtils.isEmpty(result[0].getOriginalValue())) {
Intent intent = new Intent();
intent.putExtra(SCAN_RESULT, result[0]);
setResult(RESULT_OK, intent);
DefinedActivity.this.finish();
}
}
});// Add the defined RemoteView to the page layout.
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
FrameLayout frameLayout = findViewById(R.id.rim);
frameLayout.addView(remoteView, params);
}

Ek olarak yaşam döngüsünü de yönetebiliriz.

@Override
protected void onStart() {
super.onStart();
remoteView.onStart();
}
@Override
protected void onResume() {
super.onResume();
remoteView.onResume();
}
@Override
protected void onPause() {
super.onPause();
remoteView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
remoteView.onDestroy();
}
@Override
protected void onStop() {
super.onStop();
remoteView.onStop();
}

Barkod Tarama sonucu görüntülemek için aşağıdaki kodları ekleyebiliriz.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//Receive result
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK || data == null) {
return;
}
if (requestCode == REQUEST_CODE_SCAN) {
HmsScan hmsScan = data.getParcelableExtra(DefinedActivity.SCAN_RESULT);
if (hmsScan != null && !TextUtils.isEmpty(hmsScan.getOriginalValue())) {
Toast.makeText(MainActivity.this, hmsScan.getOriginalValue(), Toast.LENGTH_SHORT).show();
}
}
}

--

--