Mobile Vision API / Firebase ML Kit で認識できるBarcodeの種別

# はじめに
* Mobile Vision API / Firebase ML Kitで認識できるBarcodeの種別は12種類
* QRコード読取りアプリを作成した際に、それぞれの種類のBarcode(QRコード)のサンプル画像があまりなく動作確認が大変だったので残しておくことにしました

# Barcodeの種類
Mobile Vision API : `Barcode.valueFormat`
Firebase ML Kit : `FirebaseVisionBarcode#getValueType()`
で種別を取得することができます。

取得できる種別は以下の12種類です。

* Text
* URL
* Email
* Phone
* SMS
* WiFi
* Geo-location (latitude and longitude)
* Contact information (VCARD, etc.)
* Calendar event
* ISBN
* Product
* AAMVA driver license/ID

# Barcodeの作成
Barcodeに含まれる文字情報に応じて、返却される種別が変わります。
コードからはrawValueとして取得することができます。
Mobile Vision API : `Barcode.rawValue`
Firebase ML Kit : `FirebaseVisionBarcode#getRawValue()`

# 各種別の形式と例

## Text
![barcode_text.png](https://qiita-image-store.s3.amazonaws.com/0/20276/8a54c242-8eda-e037-a1b5-65fd7e4692e0.png)
(テキストテスト)

* rawValueの形式が特別でない場合は、Textになります

## Url
![qr_url.png](https://qiita-image-store.s3.amazonaws.com/0/20276/f32a1fa5-b167-3b1c-452c-fb0a0c615523.png)

(MEBKM:URL:https://google.com;TITLE:Google;)

* urlのみ
    * urlのみ
    * (例)https://google.com
* MEBKM
    * MEBKM:URL:{url};TITLE:{タイトル};
    * 上記の形式でURLとタイトルを含んだBarcodeができます
    * (例)MEBKM:URL:https://google.com;TITLE:Google;

## Email
![qr_mailto.png](https://qiita-image-store.s3.amazonaws.com/0/20276/563c0dc9-2673-62f1-f013-4f9df5c1d5fd.png)
(mailto:bob@example.org,john@example.com?subject=baz&body=buzz)

* メールアドレスのみ
    * @マークが含まれ、@マーク以降の文字列に.が含まれるとメールアドレスとするようです
    * (例)123@456.com
* mailto
    * mailto:{メールアドレス}?subject={件名}&body={本文}
    * 上記の形式でメールアドレス、件名、本文を含んだBarcodeができます
    * メールアドレスはカンマ区切りで複数のtoを指定することができます
    * (例)mailto:bob@example.org,john@example.com?subject=baz&body=buzz
* MATMSG
    * MATMSG:TO:{メールアドレス};SUB:{件名};BODY:{本文};;
    * 上記の形式でメールアドレス、件名、本文を含んだBarcodeができます
    * (例)MATMSG:TO:srowen@example.org;SUB:Stuff;BODY:This is some text;;
* smtp
    * smtp:{メールアドレス}:{件名}:{本文}
    * 上記の形式でメールアドレス、件名、本文を含んだBarcodeができます
    * (例)smtp:srowen@example.org:foo:bar

## Phone
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20276/7627e0bd-02c3-17f3-d1b6-ee84f3248096.png)
(tel:1234567)

* tel
    * tel:{電話番号}
    * 上記の形式で電話番号を含んだBarcodeができます
    * (例)tel:1234567

## SMS
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20276/bdc5d442-ce62-26ea-affb-8302bc0987af.png)
(smsto:123456:test)

* smsto
    * smsto:{電話番号}:{本文}
    * 上記の形式で電話番号、本文を含んだBarcodeができます
    * (例)smsto:123456:test

## Wifi
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20276/8f95e884-3609-0229-88c3-c51e08f9077c.png)
(WIFI:S:TenChars;P:0123456789;T:WEP;;)

* WIFI
    * WIFI:S:{SSID};P:{パスワード};T:{タイプ};;
    * 上記の形式でSSID、パスワード、タイプ(WEP/WAP/OPEN)を含んだBarcodeができます
    * タイプの指定をしないとOPENになります
    * (例)WIFI:S:TenChars;P:0123456789;T:WEP;;

## Geo-location
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20276/972e2bb7-d2cc-6873-61ce-55411c83f970.png)
(geo:-20.33,132.3344)

* geo
    * geo:{緯度},{経度}
    * 上記kの形式で緯度、経度を含んだBarcodeができます
    * geo:-20.33,132.3344

## Contact information
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20276/5cc8f404-2270-87ef-3791-200f5be0b57a.png)
(MECARD:N:Foo Bar;ORG:Company;TEL:5555555555;EMAIL:foo.bar@xyz.com;ADR:City, 10001;NOTE:This is the memo.;;)

* MECARD
    * MECARD:N:{名前};ORG:{所属};TEL:{電話番号};EMAIL:{メールアドレス};ADR:{住所};NOTE:{メモ};;
    * 上記の形式で、名前、所属、電話番号、メールアドレス、住所、メモを含んだBarcodeができます
    * (例)MECARD:N:Foo Bar;ORG:Company;TEL:5555555555;EMAIL:foo.bar@xyz.com;ADR:City, 10001;NOTE:This is the memo.;;
* vCard
    * BEGIN:VCARD  
      VERSION:3.0  
      N:{名前}  
      ORG:{所属}  
      TITLE:{タイトル}  
      TEL:{電話番号}  
      URL:{URL}  
      EMAIL:{メールアドレス}  
      ADR:{住所}  
      NOTE:{メモ}  
      END:VCARD
    * 上記の形式で、名前、所属、タイトル、電話番号、URL、メールアドレス、住所、メモを含んだBarcodeができます
    * (例)  
      BEGIN:VCARD  
      VERSION:3.0  
      N:Bob  
      ORG:Sample Company  
      TITLE:Test title  
      TEL:0001234567  
      URL:http://sample.com  
      EMAIL:test@oo.com  
      ADR:test address test address2  
      NOTE:test memo  
      END:VCARD  

## Calendar event
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20276/28438f28-27a4-ffdc-6295-ba6a1d1facb9.png)
(BEGIN:VEVENT
SUMMARY:sample event
DTSTART:20180812T051200Z
DTEND:20180813T061200Z
LOCATION:test location
DESCRIPTION:sample event
END:VEVENT
)

* VEVENT
    * BEGIN:VEVENT  
      SUMMARY:{概要}  
      DTSTART:{開始時刻}  
      DTEND:｛終了時刻｝  
      LOCATION:{場所}  
      DESCRIPTION:{詳細}  
      END:VEVENT  
    * 上記の形式で、概要、開始時刻、終了時刻、場所、詳細を含んだBarcodeができます
    * (例)  
      BEGIN:VEVENT  
      SUMMARY:sample event  
      DTSTART:20180812T051200Z  
      DTEND:20180813T061200Z  
      LOCATION:test location  
      DESCRIPTION:sample event  
      END:VEVENT  

## ISBN
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20276/e7ff214a-f473-318f-5348-2a93b4db853c.png)
(9781234567897)

* ISBN文字列
    * EAN-13やJAN-13などのフォーマットで、ISBNの規格の文字列の場合、ISBNとなります 
    * (例)9781234567897

## Product
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20276/aabb5530-dc85-bf82-aed2-72968474f316.png)
(1234512345123)

* Product文字列
    * EAN-13/JAN-13/UPC-A/UPC-8などのフォーマットの文字列の場合、Productとなります 
    * (例)1234512345123

## AAMVA driver license/ID
* どのような形式で取得できるかわかりませんでした。

# 参考
* https://zxing.appspot.com/generator
    * 確認用のQRコードの生成に利用しました
* https://github.com/zxing/zxing/tree/master/core/src/test/java/com/google/zxing/client/result
    * zxingのテストコード
    * Mobile Vision API/ML Kitの種別として返ってこないケースもありましたが、読み取るBarcodeの仕様の参考になりました
* https://barcode-place.azurewebsites.net/
    * 確認用のJANコードの生成に利用しました
* https://www.barcoderobot.com/
    * 確認用のEANコードの生成に利用しました