ないぱかの記録

ないぱかからあるぱかになれるか

FlutterアプリからGoogleマップアプリを起動する

概要

任意の位置情報をGoogleマップで確認させる際、Googleマップアプリをインストールしている場合はアプリを起動させ、 未インストールの場合はSafari or ChromeGoogleマップを表示させる、という流れが一般的かと思います。

今回は上記を実現する実装について書いていきます。

開発環境

Tool Version
macOS 11.4
Visual Studio Code 1.58.0
Flutter 2.2.3
Dart 2.13.4

前提

  • 緯度経度をGoogleマップ側に渡す作りになっていること
  • ボタン押下などのイベントでGoogleマップを起動する想定であること

実装

iOS

url_launcherパッケージを使って実装します。

pub.dev

現在の最新版は6.0.9なのでそちらを取得します。

dependencies:
  url_launcher: ^6.0.9

続いて、Googleマップを起動したい任意の処理にて下記URLを起動します。

https://www.google.com/maps/search/?api=1&query={緯度},${経度}

ここで注意点として、launchのパラメータforceSafariVCfalseに設定する必要があります。

launchの中身を見てみるとわかる通り、「forceSafariが設定されていない」かつ「対象のURLが'https'か'http'で始まる」場合は必ずSafariを起動するようになっています。

今回はGoogleマップがインストールされている場合はアプリを起動したいので、forceSafariVCfalseに設定します。

        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でパッケージの公開設定を設定する必要があるためです。

参考:

developer.android.com

正しく起動できるようにするには、下記のように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などのプラグイン内で実現できないものがある場合やアプリ内でマップを表示したくない場合は上記の実装で要件を満たすことができそうです。

どなたかの参考になれば幸いです。

サンプルリポジトリ

github.com