FlutterアプリからGoogleマップアプリを起動する
概要
任意の位置情報をGoogleマップで確認させる際、Googleマップアプリをインストールしている場合はアプリを起動させ、 未インストールの場合はSafari or ChromeでGoogleマップを表示させる、という流れが一般的かと思います。
今回は上記を実現する実装について書いていきます。
開発環境
Tool | Version |
---|---|
macOS | 11.4 |
Visual Studio Code | 1.58.0 |
Flutter | 2.2.3 |
Dart | 2.13.4 |
前提
実装
iOS
url_launcher
パッケージを使って実装します。
現在の最新版は6.0.9
なのでそちらを取得します。
dependencies: url_launcher: ^6.0.9
続いて、Googleマップを起動したい任意の処理にて下記URLを起動します。
https://www.google.com/maps/search/?api=1&query={緯度},${経度}
ここで注意点として、launch
のパラメータforceSafariVC
をfalse
に設定する必要があります。
launch
の中身を見てみるとわかる通り、「forceSafari
が設定されていない」かつ「対象のURLが'https'か'http'で始まる」場合は必ずSafariを起動するようになっています。
今回はGoogleマップがインストールされている場合はアプリを起動したいので、forceSafariVC
をfalse
に設定します。
onPressed: () async { final url = 'https://www.google.com/maps/search/?api=1&query=${latitudeTextController.text},${longitudeTextController.text}'; if (await canLaunch(url)) { launch(url, forceSafariVC: false); } },
これで、iOSではGoogleマップがインストールされている場合はアプリが起動し、インストールされていない場合はSafariが起動するようになります。
インストール済みの場合 | 未インストールの場合 |
---|---|
Android
Androidに関しても基本的にOSの実装と同じ形で実現できますが、Android API30以上ではcanLaunch
でfalseが返ってきてしまいます。
url_launcher
のReadmeにも記載がありますが、API 30以降のAndroidでは、AndroidManifest.xmlでパッケージの公開設定を設定する必要があるためです。
参考:
正しく起動できるようにするには、下記のようにAndroidManifest.xml
に下記を追加します。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.launch_google_map_sample"> <--ここから追加--> <queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="https" /> </intent> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="*/*" /> </intent> </queries> <--ここまで追加--> ~~~以下省略~~~
これでAndroidに関してもGoogleマップがインストールされている場合はアプリが起動し、インストールされていない場合はChromeが起動するようになりました。
インストール済みの場合 | 未インストールの場合 |
---|---|
まとめ
今回はGoogleマップのインストールの状態に合わせて、アプリかブラウザを起動するような実装を行いました。
実装自体は簡単ですが、まとまった情報がなかったのでまとめてみました。
google_maps_flutter
などのプラグイン内で実現できないものがある場合やアプリ内でマップを表示したくない場合は上記の実装で要件を満たすことができそうです。
どなたかの参考になれば幸いです。