Timee Product Team Blog

タイミー開発者ブログ

失敗から学ぶ 〜Androidでバーコード読み取り機能を実装して学んだこと〜

この記事はTimee Product Advent Calendar 2025の11日目の記事です!

qiita.com

こんにちは。Androidエンジニアの Hunachi(@_hunachi)です。

突然ですが、日常生活において、バーコードを目にしたり、使ったりすることはけっこうありますよね。私もセルフレジでいつもピッピしています 🥦🛒

そんな身近なバーコードの読み取り機能を、Androidアプリに実装してみて失敗したときの話をします。失敗はしましたが、今はすでに安定稼働しているのでご安心ください ✅

このブログでは、コードの詳細は書きません ✂️

なお、ここではiOSの話はしません。iOSはAndroidとはまた別の苦難があり、後日iOSエンジニアの方がブログを書いてくれることを願っています 🙏📱

経緯:ユーザーにコードを読み取ってもらう機能が必要に 🧩

  • 仕様は0から自分たちで考えており、制約の範囲内でコードタイプも自由に決められる状況でした。
  • 他の箇所でQRコードを使っていたため、ユーザーが混同しないよう一次元バーコードを採用しました。
    • 社内の技術以外の制約により、チェックデジットなしの形式を選ぶ必要がありました。
  • Pixelなど主要端末での手動確認では問題は見つかりませんでした。
    • チームメンバーを含む複数人での確認も実施済みでした。
  • 今回使用した、バーコード読み取りの主要技術 🛠️
    • ML Kit(Google ML Kit)
    • CameraX(Android Jetpack)

補足注: 「チェックデジット」は、読み取り誤りを検出するための検査用桁です。今回は発行側の事情で付けない形式を採用しました。

リリース後に発生した問題 🚨

問題1:一部端末で読み取りが難しい(もしくは実質不可)📵

  • ユーザーからの問い合わせで発覚しました。
  • 分析の結果、影響は一部の数種類の端末に限られそうだと分かりました(おそらく100ユーザー以下)。
    • 低スペック端末だけの問題ではなく、高性能カメラの端末でも発生していました。
  • 特定端末を検証用として購入し、手元で再現を確認しました。
    • 高価な端末にもかかわらず、検証用として迅速に手配してもらえました(関係各位に感謝です 🙇‍♀️)。
    • 完全に不可能というほどではないものの、かなり読み取りにくいことが分かりました。
  • 問題発生確率の調査方法 🔍
    • 厳密な定量分析は難しいため、「本来読み取られるはずの回数」に対する「実際に読み取られた割合」が極端に低い端末や、問い合わせがあった端末を特定して調べました。
  • 対応策(暫定) 🧯
    • 画像からバーコードを登録できる機能を追加しました。
    • 撮影方法の説明を強化し、誤った方法で操作してしまう可能性を下げました。

問題2:誤読(別のコードとして読み取ってしまう)🔀

  • 本来そのユーザーが読み取るはずのないコードが読み取られる事象が発生しました。正しいコードが読み取れないと、そのユーザーが特定の機能を正しく使えなくなるため、重大な問題です ⚠️
    • バーコード読み取り機能に欠陥がある可能性を疑いました。
    • CameraX経由の読み取りで、ブレた画像から別コードとして解釈されるケースがあると分かりました。
  • 即時フィードバックが難しい背景 ⏱️
    • 裏側の仕組み上、ワーカーが読み取ってすぐに誤りに気づけない場合があります。
      • 多くはすぐに弾けますが、条件次第では弾けないことがあります。
  • 問題発生確率の調査方法 🧮
    • 手元での再現は運に左右され、難しいです。
    • 無効データ検出時のログを分析して、発生確率を推定しました。
  • 対応策(暫定) 🛡️
    • CameraX経由の読み取りに限り、「同一コードが1秒以上連続で読み取られた」場合のみ読み取り成立と判定するようにしました。
      • これにより、従来は弾いていた分も含め、読み間違いが減少しました。
      • 1秒という閾値は、UXの観点も踏まえて決めました。

恒久的な対策 ♻️

  • バーコードをやめ、QRコードへの全面置き換えを決めました。
    • QRコードには誤り訂正やチェックデジットがあり、問題2の発生確率がほぼ0に近づきます。
    • バーコードにチェックデジットを付ける選択肢もありましたが、誤読時に二桁同時誤りが起きる可能性があり、精度面でQRコードに劣ると判断し、QR化に舵を切りました。

学びと所感 📝

  • アプリから読み取る × 一次元バーコード(特に発行側の制約でチェックデジットがない形式)の画像読み取りは、採用しない方が良いです!🙅‍♀️
  • 低スペック端末だけが問題になるとは限らず、高性能カメラ端末でも問題が起き得ると分かりました。
  • 初期の選択は誤りでしたが、問題が見つかるたびにすぐ解決策を模索し、両OSとも最短に近い速度で対応できたのは良かったです 🚀
    • ユーザーに追加操作を強いることなく、UI/UXを損なわない形で解決できた点も良かったです 🙆‍♀️
  • 今年も失敗から多くの学びを得ました 😌
    • 次回以降は、ユーザーさんに影響を全く与えない形で失敗するようにしたいです 😭

みんなで楽しく発信していける環境、いいなと思ってくださった方は、ぜひ気軽に声をかけてください!📣 

product-recruit.timee.co.jp

product-recruit.timee.co.jp

(画像はAIで生成しています🍌)