Flutterアプリから端末にインストールされたマップアプリを起動して徒歩ルートを検索してみた

Flutterアプリから端末にインストールされたマップアプリを起動して徒歩ルートを検索してみた

2025.08.15

はじめに

こんにちは。加藤です。Flutter勉強中です。
Flutterアプリから端末にインストールされたマップアプリを起動する方法を調べてみました。
この記事では、
iOSはAppleのマップアプリとGoogleマップアプリ、AndroidはGoogleマップアプリをFlutterアプリから起動し、徒歩ルートを検索・表示することをゴールとします。

Flutter、パッケージバージョン

Flutter 3.32.8 • channel stable • https://github.com/flutter/flutter.git
Framework • revision edada7c56e (3 weeks ago) • 2025-07-25 14:08:03 +0000
Engine • revision ef0cd00091 (3 weeks ago) • 2025-07-24 12:23:50 -0700
Tools • Dart 3.8.1 • DevTools 2.45.1
url_launcher version: "6.3.2"

動作確認端末

  • iPhone 15 Pro iOS 18.6
  • Pixel 8a Android 16

url_launcherパッケージをインストール

flutter pub add url_launcherurl_launcher パッケージをインストールします。
このパッケージはFlutter Favoriteという最初に導入を検討すべきパッケージ一覧にも登録されているパッケージです。
記事執筆時点で最新の 6.3.2 がインストールされました。

実装

まずはimport 'package:url_launcher/url_launcher.dart';url_launcherをimportします。

出発点を日比谷フォートタワー、目的地を皇居とし、それぞれの緯度経度を指定することでルート検索できるようにしたいので以下のRecordを定義しました。

  // 日比谷フォートタワー
  static const _startLocation =
      (latitude: 35.670220448140384, longitude: 139.75267959285597);
  // 皇居
  static const _endLocation =
      (latitude: 35.68534070067906, longitude: 139.75281396781725);

Appleのマップアプリを起動する関数を以下に定義しました。

iOS 18.4以降、Unified Maps URLsが使える とのことですが、それ以前のバージョンサポートも考慮し、従来のMap Links を使うことにしました。

また、今回ルートは徒歩でのルートとしました。

canLaunchUrl で指定したURLをハンドリング可能なアプリがデバイスにインストールされているかを調べています。

launchUrl が実際にURLでマップアプリを起動している部分ですが、modeに LaunchMode.externalApplication を指定しています。
これはデフォルトの LaunchMode.platformDefault だとhttpsで始めるURLはアプリ内ブラウザ(iOSはSFSafariViewController、AndroidはWebView)で表示されてしまうためです。
LaunchMode.externalApplication を指定することでアプリ内ブラウザではなく外部アプリを起動するようにしています。

  Future<void> _launchAppleMap() async {
    final params = {
      'saddr': '${_startLocation.latitude},${_startLocation.longitude}',
      'daddr': '${_endLocation.latitude},${_endLocation.longitude}',
      'dirflg': 'w',
    };

    final Uri uri = Uri.https('maps.apple.com', '', params);

    if (await canLaunchUrl(uri)) {
      // デフォルトのLaunchModeだとアプリ内ブラウザ(SFSafariViewController)で表示されてしまうため、LaunchMode.externalApplicationを指定することで
      // 外部アプリであるAppleのマップアプリで表示されるようになる
      await launchUrl(uri, mode: LaunchMode.externalApplication);
    } else {
      debugPrint('Could not launch $uri');
    }
  }

Googleマップアプリを起動する関数を以下に定義しました。

iOSやAndroidで個別の実装をしない方法 かつ 公式でも推奨されていたので

GoogleマップのUniversal cross-platform syntax を使いました。
ここでもルートは徒歩でのルートとしました。

  Future<void> _launchGoogleMap() async {
    final params = {
      'api': '1',
      'origin': '${_startLocation.latitude},${_startLocation.longitude}',
      'destination': '${_endLocation.latitude},${_endLocation.longitude}',
      'travelmode': 'walking'
    };

    final Uri uri = Uri.https('www.google.com', '/maps/dir/', params);

    if (await canLaunchUrl(uri)) {
      await launchUrl(uri, mode: LaunchMode.externalApplication);
    } else {
      debugPrint('Could not launch $uri');
    }
  }

アプリは以下のようにボタンが2つあるシンプルなアプリを用意し、それぞれのボタンタップ時に前述で定義した関数を実行するようにしました。
IMG_0044

iOSでの挙動

Appleのマップアプリ、Googleマップアプリが両方インストールされている場合

まずはAppleのマップアプリ、Googleマップアプリが両方インストールされている状態での挙動を確認します。
以下のようにAppleのマップアプリが起動し、徒歩でのルートが検索できました。
IMG_0045

Googleマップの方も徒歩でのルートが検索できました。
緯度経度で場所を指定すると表示が「指定した地点」になるようです。
IMG_0046

Appleのマップアプリがインストールされていない場合

Appleのマップアプリをアンインストールした後、対応するボタンをタップした場合にどうなるか確認してみました。
外部ブラウザ(Safari)が起動しますが、徒歩ルートが検索できています。
IMG_0049

Googleマップアプリがインストールされていない場合

Googleマップアプリをアンインストールした後、対応するボタンをタップした場合にどうなるか確認してみました。
外部ブラウザ(Safari)が起動しますが、こちらでも徒歩ルートが検索できています。

IMG_0048

端末設定の「許可されたアプリと機能」でSafariがOFFの場合

設定アプリの
「スクリーンタイム > コンテンツとプライバシーの制限 > 許可されたアプリと機能」
において、SafariをOFFにすると、 canLaunchUrl が両方ともfalseを返すようになります。
したがってSafariも起動できなくなります。

Androidでの挙動

AndroidではAppleのマップは使う予定がないのでGoogleマップアプリだけ確認します。

注意点

Androidの場合、https を処理できるアプリを検索可能にするために AndroidManifest.xml にPackage visibilityを追加する必要があります。

これを指定しないと canLaunchUrl で常にfalseが返ってきてしまいます。

    <queries>
		    ...
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <data android:scheme="https" />
        </intent>
    </queries>

Googleマップアプリがインストールされている場合

以下のようにGoogleマップアプリが起動し、徒歩でのルートが検索できました。
Screenshot_20250814-232420

Googleマップアプリのアプリ情報からアプリを無効にした場合

Googleマップアプリのアプリ情報からアプリを無効にした場合はどうなるのか確認してみました。
外部ブラウザ(Chrome)が起動しますが、こちらでも徒歩ルートが検索できました。

Screenshot_20250814-232725

Chromeのアプリ情報からアプリを無効にした場合

Chromeも無効にした場合はcanLaunchUrl がfalseを返すようになります。
したがってChromeも起動できなくなります。

おわりに

url_launcherパッケージを使うことでFlutterアプリから端末にインストールされたマップアプリ起動して徒歩ルートを検索できました。

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

参考記事

https://zenn.dev/tsuruo/articles/56f3abbb132f90

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.