NOTES
【開発】Xreal繋ぐとイヤホンが途切れるので、ClaudeCodeで解決した話
ARグラスを挿すとイヤホンの音が奪われる。LE Audioを切れば直るが、今度は音がズレる。犯人を突き止めたら、LE Audioは無罪でした。LE Audioの正体と、低遅延のまま音を戻す自作アプリの話。
目次(8項目)
本記事には広告リンク(Amazonアソシエイト・A8.net)を含みます。 Amazonのアソシエイトとして、当サイトは適格販売により収入を得ています。
ARグラスというと「未来のデバイス」みたいな話になりがちですが、私の使い方はもっと地味です。移動中に画面を増やす道具として、ほぼ毎回この2通りで使っています。
- 新幹線でMacBook Airにつなぐ。グラス側に大きな画面が出るので、狭い座席でもClaudeとVivaldiを並べて作業できる。 膝の上の13インチに全部を詰め込まなくてよくなる
- Galaxy S25 Ultraにつないでライブ配信を観る。学マスのライブストリーミングなどを、仰向けに寝ながら観られるのが想像以上に楽。 スマホを顔の上で支えなくていい
どちらも音はワイヤレスイヤホン(EarFun Air Pro 4+)で聴きます。 つまりスマホ・ARグラス・イヤホンの3つが同時に繋がっている状態が常態で、 この記事はそこで起きる音の問題の話です。
なお、MacBook Airにつないだときは別の困りごとが起きます。 グラスに映した内容が本体のパネルにもそのまま出るので、 新幹線だと隣の席から作業内容が丸見えになる。そちらは別記事(ARグラスを使うとMacの画面が隣から丸見えになる)に分けて書きました。
イヤホンで音楽を聴いている状態でXreal Oneを挿すと、音がイヤホンからグラスの内蔵スピーカーに移り、そのまま戻ってこない。 新幹線や電車の中だとそのまま音漏れになるので、これは実害があります。
回避策自体は見つけていました。設定を開いてイヤホンのLE AudioをOFFにし、 「オーディオ」をONにし直すと音が戻ります。実際これで戻るので、 毎回この往復を手でやっていました。
ところが、これはこれで困る。LE Audioを切ると遅延が増えて、口の動きと音がずれるのです。 ライブ配信を観るときにこれは相当な違和感で、我慢して観られるものではありませんでした。 「音は戻ったが、代わりにズレる」という状態です。
音を低遅延のまま(LE Audioを切らずに)イヤホンから出したい。 しかも毎回の手作業なしで。この記事は、それを実現するまでに見当違いのアプリを1本完成させた記録です。
この記事に出てくる3点です。すべて自分で買って日常的に使っているものです。

ARグラスはXreal Oneを使っています。USB-C有線接続で、 スマホやMacからは外部ディスプレイ兼USBオーディオデバイスとして見えます。 この「オーディオデバイスとしても認識される」ところが、後で効いてきます。

ここから技術編です。まず前提として、LE Audioが何なのかを整理しておきます。 日本語の情報がまだ少なく、私自身も調べながら理解した部分です。
ひとことで言うと、LE Audioは従来のBluetoothオーディオとは別系統の新しい仕組みです。 「Bluetoothの新バージョン」ではなく、通信の土台からコーデックまで作り直されています。
| 従来(A2DP) | LE Audio | |
|---|---|---|
| 通信の土台 | Classic Bluetooth(BR/EDR) | Bluetooth Low Energy |
| コーデック | SBC・AAC・aptX・LDAC など | LC3 |
| 遅延 | 大きめ(映像とずれやすい) | 小さい |
| 通話中の音質 | 落ちる(HFPに切り替わる) | 落ちない |
| 消費電力 | 多い | 少ない |
| 複数人で同じ音を聴く | 不可 | 可能(Auracast) |
実用上いちばん体感できるのは遅延です。 私がテレビにまでLE Audioトランスミッターを付けているのはこれが理由で、 口の動きと音のズレが気にならなくなります。ライブ配信を観るときも同じです。
実際にAndroidの内部状態を見ると、同じイヤホンでも接続方式によって 扱いが変わっているのが分かります。従来接続ではbt_a2dpとして、LE Audio接続ではble_headsetとして認識され、コーデックもLC3と表示されます。 Bluetoothの接続種別も、従来はBR/EDR、 LE AudioではLEで繋がっていました(実機で確認)。
使うには「両方が対応していること」が要る
LE Audioはスマホ側とイヤホン側の両方が対応していないと使えません。 そして対応機種はまだ多くありません。Androidではデバイスごとに設定画面でON/OFFできるようになっていて、 Galaxyの場合は「設定 → 接続 → Bluetooth → 対象機器の歯車」の中にスイッチがあります。
ここで一点、後の話につながる仕様があります。同じ画面には 「LE Audio」と「オーディオ(従来接続)」のスイッチが並んでいて、この2つは排他です。LE AudioをONにすると従来接続は自動でOFFになり、 LE AudioをOFFにしても従来接続は自動では戻りません。 この非対称さが、私を勘違いさせることになります。
問題が起きたとき、私が最初に立てた仮説はこうでした。「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)」と明記いただければ、メディア・ブログ・資料への引用を歓迎します。
ほかの記録
← 記録の一覧へ