NOTES
ARグラスをつなぐとイヤホンの音が奪われる — 犯人はLE Audioではなかった
Galaxy S25 UltraにXreal Oneをつなぐと、EarFunで聴いていた音がグラスのスピーカーに移って戻らない。LE AudioをOFFにすれば直りますが、今度は遅延が増えてライブ映像の口の動きとズレます。犯人はLE Audioではなくメディア出力先の「後勝ち」でした。LE Audioとは何か、A2DPと何が違うのかもあわせて、実測ログから解説します。
問題が起きたとき、私が最初に立てた仮説はこうでした。「LE AudioがONだと、音がARグラスに取られる」。
根拠はありました。設定でLE AudioをOFFにして「オーディオ」をONにすると、 実際に音がイヤホンに戻るからです。何度やっても戻る。 だからLE Audioが原因だろうと考えて、 この設定往復を1タップにするアプリを作りました。 クイック設定のタイルを押すと設定画面を自動操作してLE Audioを切る、というものです。 実測でタップから完了まで553ミリ秒。道具としてはちゃんと動きました。前提が間違ったまま。
3点揃えて、接続順を変えて実験した
スマホ・イヤホン・グラスが揃った状態で、接続の順序を変えながら再現条件を詰めました。 ここで想定が崩れます。
| 接続の順序 | 結果 |
|---|---|
| グラス接続中に、イヤホン側から接続 | 従来接続(A2DP)で繋がる |
| グラス接続中に、設定から切断→再接続 | LE Audioのまま復帰。音もイヤホン |
| グラス接続中に、LE AudioをONにする | LE Audio / LC3。音はイヤホンのまま(症状出ず) |
| イヤホン接続中に、あとからグラスを挿す | 音がグラスに移り、戻らない ← 症状はこれだけ |
LE AudioをONにしても症状が出ない。再現したのは「イヤホンが先、グラスが後」という順序のときだけでした。 そのときの観測がこれです。
13:51:39 出力先: イヤホン(LE Audio / LC3)← グラスを抜いた直後
13:51:52 出力先: XREAL One ← 挿した瞬間に移り、戻らない
このときBluetooth接続はLEのまま維持されていた
つまりイヤホンのBluetooth接続は無傷で、 メディアの出力先だけが「最後に接続されたデバイス」=グラスに移っていました。 Androidの標準的な挙動で、LE Audioは無関係です。
では、なぜ「LE AudioをOFFにする」と直っていたのか。 あの操作をするとイヤホンが繋ぎ直されるので、 イヤホンが「最後に接続されたデバイス」になるからでした。 直っていた理由はLE Audioを切ったことではなく、再接続という副作用のほう。 私は副作用を目的だと誤解していたわけです。
そして、この誤解のせいで最初のアプリは症状を直すたびに低遅延を捨てる作りになっていました。 いちばん欲しかったもの(ライブで音がズレないこと)を、自分で毎回壊していたことになります。
回避策が効いている理由を確かめないまま、自分の見立てを仕様にしてアプリを1本完成させました。 再現できる環境が揃った時点で、仮説はいったん全部捨てて観測し直すべきでした。 正しい直し方は単純で、クイック設定の「メディア出力先」でイヤホンを選び直すだけ。 これならLE Audioを保ったまま音が戻ります。これを自動化したのがGlass Cockpitです。
真犯人が分かれば、直し方は単純でした。 クイック設定の「メディア出力先」でイヤホンを選び直すだけ。 これならLE Audio(LC3)を保ったまま音が戻ります。 設定画面でLE Audioを切る必要はまったくありませんでした。
これを自動化したのがGlass Cockpitです。 ARグラスの接続を検知して、音の出力先をイヤホンへ自動で戻します。
| 内容 | |
|---|---|
| 動作 | グラスを挿すと約7秒で自動復帰。操作はゼロ |
| LE Audio | 維持したまま戻す。低遅延を捨てない |
| 手動 | クイック設定タイル1タップ(保険) |
| ついで | スマホの輝度を最低に・サイレント化。抜いたら元に戻す |
「ついで」の部分を説明すると、グラスにミラーリングしているときスマホ本体のパネル輝度は映像に影響しません(実機で確認)。 つまり本体を明るく光らせておく意味がないので、最低まで落とします。 通知バナーが視界に映り込むのも邪魔なので、サイレントにします。 グラスを抜いたら全部元の値に戻します。
最後の実地確認では、グラスを挿して音を奪われてから7.3秒後に、何も操作せず音がイヤホンに戻りました。 接続はLEのまま、コーデックもLC3のまま。 「LE Audioを使い続けたい」という最初の要件を、今度こそ満たせています。
LE Audioのデバイス単位のON/OFFや、メディア出力先の切り替えは、通常のアプリから直接いじれません(特権権限が必要)。 そのため、これらのアプリは「人間と同じ手順を機械にやらせる」= 画面を自動操作する方式で作っています。この方式には独特の罠がありました。
未接続なのに「成功しました」と言うバグ
イヤホンがケースに入ったまま(未接続)でタイルを押すと、 アプリは成功を報告するのに実際には何も起きない、というバグが出ました。 原因は未接続でも設定画面は開けて、スイッチが全部OFFに見えることです。 アプリは「OFFだからONにしよう」と判定し、タップは成功し、成功報告まで返す。 でも実体が繋がっていないので効果はゼロ。
使う側から見ると「押したのに何も変わらない」という、いちばん信用を失う壊れ方です。 対策として、成否の判定を画面表示ではなく実際の音の経路で行うようにしました。 「押せたか」ではなく「音が本当にイヤホンに向いたか」を確認してから完了と言う、という設計です。
同じ「押す」でも、画面によって当たる先が変わる
自動化の実装ではもう一度転んでいます。 アクセシビリティ機能のクリックは「クリック可能な親要素」に届く仕様なので、 通知シェードから実行したときだけ狙ったボタンではなくメディア通知カード全体が反応して、音楽アプリが全画面で開くという事故が起きました。 座標を直接タップする方式に変えて解決しています。
「押せた≠効いた」は、店の機械を遠隔で操作するときにまったく同じ形で出てきます。 コマンドが通ったことと、現地の機械が意図した状態になったことは別で、 前者だけ確認して「成功」と記録すると、誰も気づかないまま壊れています。 確認すべきは操作の成否ではなく結果の状態です。
自分の機種でしか動かない状態だったものを、特定の製品に依存しない形に直して公開しました。 無料で、ソースも全部見られます。
ri719/glass-cockpit— USB-C接続のARグラス(XREAL・VITURE・Rokidなど)を挿すと、 音の出力先をイヤホンに自動で戻すAndroidアプリ。
公開のために汎用化してみると、自分の環境に癒着していた箇所が次々に出てきました。 日本語の画面ラベルを決め打ちしていて他言語環境で動かない、 Samsung固有の画面構造に依存していて他メーカーで歯車を押せない、といった具合です。
画面を自動操作するアプリはOSの更新で必ず壊れますが、 壊れ方の大半は「文言が変わった」です。そのためコードを触らずアプリ内でラベルを追記できる逃げ道を付けました。 こういう「壊れたときに自分で直せる隙間」を残せるかどうかで、道具の寿命が変わります。
もうひとつ、公開前に気づいたこと。作業ログには端末のシリアル番号がそのまま残っていました。 公開リポジトリに入れる前に見つけて除去しましたが、 ログを貼る作業は、そのまま個人情報を貼る作業でもあります。 開発ログを公開する人は、コードより先にログを疑ったほうがいいです。
同じ日に、MacBook Air側の困りごと(グラスに映した内容が本体画面にも出て、 隣から丸見えになる)を解決するアプリも作っています。そちらはARグラスを使うとMacの画面が隣から丸見えになるに書きました。
検証環境: Galaxy S25 Ultra(Android 16 / One UI)・EarFun Air Pro 4+・Xreal One。 記事中の時刻・所要時間は2026年8月15日の開発ログの実測値です。 挙動はOSやOne UIのバージョンによって変わる可能性があります。
よくある質問
ARグラスをつなぐとBluetoothイヤホンから音が出なくなるのはなぜですか?
Androidは「最後に接続されたオーディオデバイス」をメディアの出力先にするためです。イヤホンで再生中にUSB-CのARグラスを挿すと、グラスが後から来たデバイスとして出力先を奪います。イヤホンのBluetooth接続自体は切れておらず、出力先だけが移っています。
LE AudioをOFFにすると直るのはなぜですか?
LE Audioの切り替え操作でイヤホンが繋ぎ直され、イヤホンが「最後に接続されたデバイス」になるからです。直っているのはLE Audioを切ったからではなく、再接続の副作用です。実測ではLE Audioを保ったまま、クイック設定の「メディア出力先」でイヤホンを選び直すだけで音は戻りました。
LE Audioは従来のBluetooth(A2DP)と何が違うのですか?
通信の仕組みそのものが別系統です。従来のA2DPはClassic Bluetoothの上でSBCやAACなどのコーデックを使いますが、LE AudioはBluetooth Low Energyの上でLC3という新しいコーデックを使います。低消費電力で遅延が小さく、通話時も音質が落ちません。ただし対応はスマホとイヤホンの両方に必要で、Androidではデバイスごとに設定でON/OFFできます。
同じ問題は他のARグラスやイヤホンでも起きますか?
USB-Cでオーディオデバイスとして認識されるARグラス(XREAL・VITURE・Rokidなど)全般で同じ挙動になります。LE Audio固有の問題ではないため、従来のA2DP接続のイヤホンでも起きえます。
作ったアプリはどこで入手できますか?
GitHubで無料公開しています(ri719/glass-cockpit)。特定の機種名に依存しない形に汎用化してあり、ソースも全部見られます。Mac側の覗き見対策アプリ(ri719/veil)も別途公開しています。
本記事の店舗数・分布などの数値は、当サイトが継続運営する全国セルフ写真館ディレクトリ (全国セルフ写真館 完全ガイド) の調査に基づく「GENICA調べ」の一次データです。出典として「セルフ写真館GENICA調べ (genica-photo.com)」と明記いただければ、メディア・ブログ・資料への引用を歓迎します。
ほかの記録
← 記録の一覧へ