プロジェクトの目的
レクサス UX250h の純正ナビは…というか世の中のナビ大体そうなのかなと思ってるが、
- 店名で検索しても見つからない
- 古いデータが残っている
- 遠方の同名施設が候補に出る
など使い勝手が悪い。
一方、Googleマップは検索精度が非常に高いため、
Googleマップで検索した地点をワンタップで純正ナビへ送る
というAndroidアプリを作りたい。
最終的なユーザー操作イメージ
- Googleマップで目的地を検索
- 行きたい場所を開く
- 「共有」を押す
- 共有先から自作アプリを選択
- 自作アプリが自動で処理
- NaviConへ地点情報を送信
- 車のナビが目的地設定される
ユーザーはGoogleマップだけを使えばよく、
自作アプリは裏側で処理するだけの「橋渡し役」にしたい。
UIについて
最初は専用UIは不要。
Googleマップの検索UIをそのまま利用した方が、
- Googleの検索精度をそのまま使える
- UI開発が不要
- 保守が楽
というメリットがある。
技術構成
- Android:Kotlin
- HTTP通信:OkHttp
- Google Maps:Share(Intent)
- 車:NaviCon連携(Intent)
NaviConについて
仮説として、Googleマップから取得した、
- 緯度
- 経度
- 地点名
をそのままNaviConへ渡せれば、ナビ側は座標を目的地として設定できるはず。
特に重要なのは、
座標を送ること
名前は補助情報程度。
ナビ内に施設名が存在しなくても、緯度経度さえあれば目的地設定できる可能性が高い。
座標精度
GPS誤差は数メートルあるものの、住宅レベルまで案内可能。
玄関ピッタリではないが、実用上は十分。
最大の懸念
Googleマップの共有が、
何を渡してくれるのか
これが最大の不確定要素。
懸念は、Googleマップが、
https://maps.app.goo.gl/xxxx
のような短縮URLしか渡してくれないのでは?という点。
実際に確認したこと
LINEへGoogleマップを共有したところ、送られてきたのはGoogleマップURLのみだった。
つまり、Googleマップは座標を直接共有していない可能性が高い。
そこから考えた仮説
短縮URLなら、まずURLを展開すればよい。
展開後URLの中には、
- 緯度
- 経度
- Place ID
などが含まれている可能性がある。
つまり、
Googleマップ共有
↓
短縮URL取得
↓
URL展開
↓
緯度経度抽出
↓
NaviCon送信
という流れになる。
URL展開について
ここは特殊な技術ではない。
HTTP通信すると、Googleサーバーが「302 Redirect」を返してくる。
HTTPライブラリ(OkHttp)は、このリダイレクトを自動追跡できるため、最終URLを取得できる。
つまり、自前で短縮URLを解析する必要はない。
Android側で気になったこと
Q1:Googleマップの共有先に自作アプリを表示できる?
回答
可能。
AndroidのIntent Filterを定義すればよい。
Q2:Googleマップは座標を直接くれる?
回答
現時点では不明。
まず実際に共有データを受け取って確認する必要がある。
開発方針
いきなり完成版を作らない。
不確定要素だけを順番に潰す。
フェーズ1:Googleマップから共有を受信できるか
目的
Intent受信確認
完成条件
Googleマップから共有すると、自作アプリが起動する。
フェーズ2:共有データ確認
目的
Googleが何を送っているか調査
完成条件
TextViewなどに受信データを全部表示する。
確認したい内容
- URLだけか?
- Place IDがあるか?
- 座標があるか?
フェーズ3:短縮URL展開
目的
Google短縮URLを元URLへ変換
完成条件
最終URLが取得できる。
フェーズ4:URL解析
目的
展開後URLから緯度・経度取得
完成条件
画面に、
Latitude
Longitude
が表示される。
フェーズ5:NaviCon連携
目的
取得した座標をNaviConへ送る
完成条件
NaviConが起動する。
フェーズ6:実車確認
目的
UX250h純正ナビで目的地設定されるか確認
完成条件
車のナビが目的地設定される。
このアプリの本質
このアプリは、Googleマップの代替ではない。
GoogleマップとNaviConを橋渡しする、非常に小さなユーティリティである。
検索機能も地図表示も持たず、共有データを受け取り、必要な情報だけ抽出して、NaviConへ渡すことだけを責務とする。
じゃあやってみるかな
どこでつまづくかは分からんが、とにかく作ってみよう。

コメント