>_ DevTrendsja

言語

ホーム

言語

セクション

フロントエンド バックエンド モバイル DevOps AI / ML ゲーム開発 ブロックチェーン 組み込み セキュリティ
Kotlin

ほこりをかぶったタブレットを本格的なAndroid Autoディスプレイに変える方法

使わなくなったAndroid 5や7のタブレットで、最新のGoogle Playアプリが動かなくなっているものはありませんか?そう言ったタブレットを捨てるのは忍びないけれど、使う場所もないですよね。車のダッシュボードにナビとして取り付けるのは理にかなっています。しかし、タブレットの画面上で単独のアプリを実行するのは必ずしも便利ではありません。スマホのメッセージが届かない、電話の音声がストリーミングされない、走行中にルートポイントを再入力する必要があるといった問題があります。

300~500ドルの中国のヘッドユニットを買うこともできます。しかし、ハードウェアの品質は疑わしいことが多く、ファームウェアは3日ごとにフリーズします。Open Headunitリポジトリは、別のソリューションを提供します。これはオープンソースのAndroid Autoレシーバーエミュレータで事実上あらゆるAndroidデバイスを車載ディスプレイに変えます。

Headunit Logo

なぜ古いプロジェクトを復活させるのか

元のHeadunitプロジェクトは、開発者のMichael Reedによって書かれたものです。時間が経つにつれ、著者はコードベースの更新を止め、GoogleはAndroid Autoの通信プロトコルを常に変更し続けていました。Andre Knirimがプロジェクトを引き継ぎ、Kotlinでロジックの大部分を書き直し、Open Headunitを作成しました。

アプリの主なタスクは、スマートフォンからデータストリームをlistenし、動画をデコードし、タッチスクリーンとステアリングホイールボタンのシグナルを返すことです。重要なことに、Android 4.1搭載のデバイスでもエミュレータを実行できます。

Open Headunit screenshot

接続方法々とプロトコルの落とし穴

電話でエミュレータに接続するには、ケーブル経由かワイヤレス経由かのどちらかを選べます。しかし、ここからニュアンスが始まり、それがこのプロジェクトが定期的に新鮮なコミットを受け取る理由です。

有線USB接続

最も信頼できるオプションです。ケーブルで動画を遅延なくストリーミングし、同時にスマホにも充電できます。

動作させるには、タブレットのUSB Host(OTG)サポートが必要です。Open Headunitの設定では、標準のAndroid USBスタックまたはlibusbライブラリを選択できます。2番目のオプションは、特定の中国製AllwinnerおよびMediaTekチップセット場合に便利です。これらのチップセットでは、標準のAndroid USBサブシステムがわずかな障害でUSBデバイスを無効にしてしまうことがあります。

ワイヤレスモードとGoogleの細工

Googleは6ヶ月ごとにAndroid Autoを一貫して更新し、Wi-Fi経由での動画伝送の非公式な方法を 끊ちます。例えば、Android Auto 17.4リリースでは、開発者は再び接続方式を一新し、サードパーティのワイヤレスヘルパーを壊してしまいました。

現在、このプロジェクトはいくつかのワイヤレス接続オプションを実装しています:

  • Wireless Helper:スマートフォン用の別のコンパニオンアプリです。自動ホットスポット起動、ローカルネットワーク上のheadunitサーバー検索、余計なクリックなしでストリーミング開始を処理します。
  • Wi-Fi Direct(P2P):外部Wi-Fiネットワークやモバイルホットスポットなしで、2つのデバイス間の直接接続です。
  • ネイティブモード:Bluetoothハンドシェイク経由で標準接続をエミュレートします。すべての場所で動作するわけではなく、タブレットはほとんどが、必要なBluetoothプロファイルを同時に適切に処理できません。

自動化スクリプトから直接ワイヤレス接続を開始できます。TaskerやMacroDroidを使用している場合、1つのintentで特定のIPアドレスに接続するコマンドを送信できます:

adb shell am start -a android.intent.action.VIEW -d "headunit://connect?ip=192.168.1.25"

Open Headunit screenshot

内部構造

このプロジェクトはKotlinで書かれていますが、内部には多くの低レベルなハードウェア処理が隠されています。

まず、動画のデコードです。デフォルトでは、システムはH.264またはH.265用のハードウェアMediaCodecを使用しようとします。タブレットのチップセットがH.265 NALパケットを正しく処理できない場合(これは古いAmazon FireタブレットやRockchipデバイスで一般的です)、「Android is starting」というメッセージで画面がフリーズします。この問題を回避するために、開発者はFFmpegソフトウェアデコーダーを組み込みました。このソリューションは弱いシングルコアプロセッサではFPSが低下しますが、黒い画面なしで安定した映像を提供します。

次に、オーディオフォーカス処理です。バージョン3.2.0までは、タブレットの音楽再生がスマートフォンのナビ音声を中断していました。著者はAudioTrackWrapperを書き直し、動的なオーディオフォーカスキャプチャを追加しました。これにより、バックグラウンドサウンドを中断せずにシステムのルート案内の音声プロンプトをミックスできるようになりました。

3番目に、コントロールです。Open Headunitは、工場出荷時のステアリングホイールボタン(MTC、FYT)およびロータリージョイスティックコントロールからのシグナルを傍受できます。設定にはビジュアルキースニファーが含まれており、物理ボタンをAndroid Autoインターフェース内のアクションに割り当てることができます。

Open Headunit screenshot

面倒なバグとその直し方

ハードウェアとAndroidバージョンの違いにより、設定セクションを確認する必要があるでしょう。

  • ポートレートモードでGoogle Mapsがタップに応答しない。これはGoogleサービスとサードパーティエミュレータ間の相互作用における既知のバグです。アプリ設定のDPI(ピクセル密度)パラメータを200未満の値(例:190)に下げることで修正できます。
  • 映像がコマ落ちしたり遅延する。組み込みのAuto-Optimization Wizardを実行する必要があります。これは解像度組み合わせ(最大14,040p)とコーデックを自動的に循環し、ビデオデコーダーに最適な組み合わせを選択肢ます。
  • Wi-Fiが頻繁に切断する。スマホのAndroid設定で、「Wi-Fiアシスタント」機能(インターネットがない場合でも信号が弱いときにモバイルネットワークへの自動切り替え)を無効にする必要があります。

まとめ

Open Headunitは、オープンコミュニティが計画的なハードウェアの陳腐化の問題を解決する方法の素晴らしい例です。ほこりをかぶったタブレット、車のマウント、セットアップのための1時間の空き時間があれば、新しいヘッドユニットに費用をかけることなく、車に便利なナビとメディアシステムが手に入ります。

このプロジェクトはアクティブで、外部コントリビューターからのPRが定期的に受け入れられており、リポジトリWikiには特定の中国プラットフォーム向けの詳細なデバッグ手順があります。

関連プロジェクト