# HMS Core Scan SDKを使用したバーコードスキャン機能の実装

##概要
当社の最新の記事で、HMS Core Scan SDKを迅速に統合する方法を検討し、このSDKをその他のオープンソースのバーコードスキャンツールと比較しました。まだこの記事をお読みでない場合は、ここクリックして、ご覧いただけます。
私たちは、商品を購入したり、ソーシャルメディアアカウントをフォローしたり、製品に関する情報を入手したりする場合に毎日バーコードを利用しています。今日は、バーコードスキャン機能をショッピングアプリに実装する方法についてご紹介します。
##シナリオ
ユーザーはこの機能を使用してバーコードをスキャンし、製品の情報や購入時に利用できるリンクを受信できます。
![GIF-200601_214005.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690066/bd6162f3-6190-bb5f-c772-28740f4075f9.gif)


##プロセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690066/f88bb343-86f9-4db6-ddef-102523443621.png)
##準備
###gradleディレクトリのbuild.gradleファイルを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690066/403dfc5c-35bb-915b-3903-e7f4557dfe71.png)
**allprojects > repositories**に移動し、HMS Core SDKのMavenリポジトリアドレスを設定します。

```
allprojects {    
        repositories { 
        google() 
        jcenter() 
        maven {url 'http://developer.huawei.com/repo/'} 
    } 
 }
```
**buildscript > repositories**に移動し、HMS Core SDKのMavenリポジトリアドレスを設定します。

``` 
buildscript { 
    repositories { 
        google() 
        jcenter() 
        maven {url 'http://developer.huawei.com/repo/'} 
    } 
 }
```
###ビルド依存関係を追加する
**app**ディレクトリの**build.gradle**ファイルを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690066/5ad175f2-64c5-628b-c8d1-4c4837cc26fa.png)
HMS Core SDKを統合します。

```
dependencies{  
    implementation 'com.huawei.hms:scan:1.1.3.301'
}
Assign permissions and specify features.
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
```
SDKの統合にはデフォルト表示モードを使用するため、アプリの**AndroidManifest.xml**ファイルでスキャン画面を宣言します。

```
<activity android:name="com.huawei.hms.hmsscankit.ScanKitActivity" />
```
##実装
製品の追加と製品の照会という2つの関数を実装できます。製品のバーコードをスキャンし、撮影することで製品をバインドできます。ユーザーは、バーコードをスキャンしてその製品を照会できます。
###動的な権限の申請を送信する

```
private static final int PERMISSION_REQUESTS = 1;
@Override 
public void onCreate(Bundle savedInstanceState) { 
    // Checking camera permission   
   if (!allPermissionsGranted()) {
       getRuntimePermissions();
   }
}
```
###画面を開いて製品を追加する
**Add Product**をタップし、製品を追加できる画面を開きます。

```
public void addProduct(View view) {
        Intent intent = new Intent(MainActivity.this, AddProductActivity.class);
        startActivityForResult(intent, REQUEST_ADD_PRODUCT);
    }
```
###バーコードをスキャンして製品情報を記録する
HUAWEI Scan Kitのデフォルト表示モードを使用してバーコードをスキャンします。

```
private void scanBarcode(int requestCode) {
        HmsScanAnalyzerOptions options = new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.ALL_SCAN_TYPE).create();
        ScanUtil.startScan(this, requestCode, options);
    }
```
###コールバック関数でスキャン結果を保存する
```
@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data == null) {
            return;
        }
        if ((requestCode == this.REQUEST_CODE_SCAN_ALL)
                && (resultCode == Activity.RESULT_OK)) {
            HmsScan obj = data.getParcelableExtra(ScanUtil.RESULT);
            if (obj != null && obj.getOriginalValue() != null) {
                this.barcode = obj.getOriginalValue();
            }

        } else if ((requestCode == this.REQUEST_TAKE_PHOTO)
                && (resultCode == Activity.RESULT_OK)) {
            ……
        }
}
```
###バーコードをスキャンして製品を照会する
**Query Product**をタップし、製品を照会できる画面を開きます。コールバック関数を使用して結果を表示します。

```
public void queryProduct(View view) {
        HmsScanAnalyzerOptions options = new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.ALL_SCAN_TYPE).create();
        ScanUtil.startScan(this, REQUEST_QUERY_PRODUCT, options);
}

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data == null) {
            return;
        }
        if ((requestCode == this.REQUEST_ADD_PRODUCT) && (resultCode == Activity.RESULT_OK)) {
            barcodeToProduct.put(data.getStringExtra(Constant.BARCODE_VALUE), data.getStringExtra(Constant.IMAGE_PATH_VALUE));
        } else if ((requestCode == this.REQUEST_QUERY_PRODUCT) && (resultCode == Activity.RESULT_OK)) {
            HmsScan obj = data.getParcelableExtra(ScanUtil.RESULT);
            String path = "";
            if (obj != null && obj.getOriginalValue() != null) {
                path = barcodeToProduct.get(obj.getOriginalValue());
            }
            if (path != null && !path.equals("")) {
                loadCameraImage(path);
                showPictures();
            }
        }
    }
```
##早速、試してみましょう
**Add Product**をタップします。画面が表示されるので、製品のバーコードをスキャンし、製品を撮影します。**Query Product**をタップし、製品のバーコードをスキャンします。製品がシステムに記録されると、その製品の情報が返されます。
![GIF-200527_161851-v2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690066/2fcde9ea-3bd2-3cc7-2fbe-e1b20d434872.gif)

##More Info in Huawei Developer website
https://developer.huawei.com/consumer/en/hms/huawei-mlkit

##近日公開予定
HUAWEI Scan Kitを使用して可能となる、驚くような事例をさらにご紹介します。是非お待ちください。