
この記事はTimee Product Advent Calendar 2025の11日目の記事です!
こんにちは。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の観点も踏まえて決めました。
- CameraX経由の読み取りに限り、「同一コードが1秒以上連続で読み取られた」場合のみ読み取り成立と判定するようにしました。

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

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