はじめに
こんにちは。Androidエンジニアの佐藤です。
今回は、アプリのバーコードスキャン機能の精度改善を行なった時のお話をいたします。
ユーザー体験の向上を目指して古いライブラリからGoogleのML Kitへ移行したのですが、その過程では技術選定のトレードオフや、思わぬ「速さの弊害」など、多くの学びがありました。
この記事が、同じような課題に直面している開発者の皆さんにとって、少しでも参考になれば嬉しいです。
すべての始まりは「読み取りにくい」というユーザーの声
私たちのアプリには、商品のバーコードを読み取って食事を記録する機能があります。
しかし、ユーザーの皆様から「バーコードがなかなか読み取れない」「フォーカスが合わなくて時間がかかる」といったフィードバックが寄せられていました。
調査してみると、原因は明らかでした。
私たちが使っていたバーコードスキャンライブラリは、もう4年ほどアップデートされていません。
これでは、最新のデバイスやOSで最適なパフォーマンスを発揮できないと考えました。
ユーザーに快適な体験を届けるため、Androidチームで協議し、ライブラリの移行を決意しました。
【課題の可視化:旧ライブラリの実際の動き】
動画を見ていたくとわかる通り、ピントが合うまでに時間がかかり、ユーザーを待たせてしまっている状態でした。
(すみません、、この動画では最後までスキャンすることができませんでした。)

解決策の検討:Googleの「ML Kit」
新しいライブラリとして、私たちはGoogleが公式に提供している ML Kit に注目しました。
ML Kitは、機械学習の専門知識がなくても、強力な機能をアプリに組み込めるライブラリです。
バーコードスキャンにおいても、高速かつ高精度な読み取りが期待できます。
このML Kitを導入するには、大きく分けて2つの方法がありました。
パターン1:お手軽実装! play-services-code-scanner
これは、ML Kitの機能を内包し、Google Play Service上で動作するAPIです。
- メリット
- Googleが動作を保証してくれる安心感
- 数行のコードで実装できる手軽さ
- デメリット
- UIのカスタマイズが一切できない
- 連続スキャンができないため、一度スキャンするたびに画面が閉じてしまう
UIのカスタマイズができないのは大きな問題でした。既存の操作性は「カメラをかざし続けると連続でスキャンできる」というもの。しかし、この方法ではスキャン成功のたびに画面が中断されてしまい、ユーザー体験が大きく変わってしまいます。
【play-services-code-scanner の動作イメージ(Google公式サイトより)】
出典:https://developers.google.com/ml-kit/images/auto_zoom.gif
実装は簡単ですが、UXの観点からは受け入れがたい選択肢でした。
パターン2:自由度MAX! CameraX + mlkit:ScanCode API
こちらは、カメラのプレビュー表示を CameraX で自前で実装し、その映像を直接ML KitのAPIに連携させる方法です。
- メリット
- 画面UIを自由にカスタマイズできる
- 連続スキャンなど、既存の操作性を完全に再現可能
- デメリット
- カメラの描画やML Kitとの連携など、コードが複雑になる
- 自前でライブラリのメンテナンス(バージョンアップ追従など)が必要になる
意思決定:最高のユーザー体験のために
2つのパターンを比較し、私たちのチームが出した結論はパターン2(CameraX + ML Kit)の採用でした。
実装の複雑さというデメリットはありましたが、「最高のユーザー体験を提供する」という目的を達成するためには、UI/UXの自由度が不可欠だと判断したからです。
万が一に備えて、新機能をRemoteConfigでON/OFFを切り替えられるようにし、問題が発生した際にはすぐに旧バージョンに戻せる保険もかけました。
(後にこの修正によるクラッシュを検出し、保険を活かすことになりました。。)
【そして、これが完成形!】
この圧倒的な速さ!
旧バージョンとは比べ物にならないほど、スムーズにバーコードを検出できています。

速すぎるがゆえの新たな課題
しかし、ここで予期せぬ問題が浮上します。
それは、「読み取りが速すぎて、誤検出することも多い」というものでした。
カメラをかざした瞬間にバーコードを検出してくれますが、手ブレしていたりすると、誤検出が多くなりました。
私たちは、この課題に対して、読み取りデータのフィルタリング処理を自前で行うようにしました。
具体的には、取得したデータがN回一致したら、正確なデータとして扱うようにしています。
これで、誤検出を極力減らすことに成功しました!
まとめ
今回のプロジェクトを通じて、私たちは古い技術的負債を解消し、ユーザー体験を劇的に向上させることができました。
- 課題: 古いライブラリによってバーコードスキャン精度が低い
- 解決策:
CameraXとML Kitを用いたスキャン機能の再実装 - 学び:
- ライブラリの定期的なアップデート、メンテナンスは重要
- パフォーマンスの劇的な向上は、時として予期せぬ課題を生むことがある
- チーム一丸となってアイディアをだし、改善していくことが大切
技術選定の道のりは単純ではありませんが、目的を見失わずにチームで議論を重ねることで、最良の答えにたどり着けると改めて感じました。
最後まで読んでいただき、ありがとうございました!
採用について
askenでは、ユーザー体験の改善を技術的な側面から考えられる/していきたいエンジニアを絶賛募集中です。
まずはカジュアルにお話しできればと思いますので、ぜひお気軽にご連絡ください!
https://hrmos.co/pages/asken/jobs
