
Flutterアプリから端末にインストールされたマップアプリを起動して徒歩ルートを検索してみた
はじめに
こんにちは。加藤です。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_launcher
で url_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つあるシンプルなアプリを用意し、それぞれのボタンタップ時に前述で定義した関数を実行するようにしました。
iOSでの挙動
Appleのマップアプリ、Googleマップアプリが両方インストールされている場合
まずはAppleのマップアプリ、Googleマップアプリが両方インストールされている状態での挙動を確認します。
以下のようにAppleのマップアプリが起動し、徒歩でのルートが検索できました。
Googleマップの方も徒歩でのルートが検索できました。
緯度経度で場所を指定すると表示が「指定した地点」になるようです。
Appleのマップアプリがインストールされていない場合
Appleのマップアプリをアンインストールした後、対応するボタンをタップした場合にどうなるか確認してみました。
外部ブラウザ(Safari)が起動しますが、徒歩ルートが検索できています。
Googleマップアプリがインストールされていない場合
Googleマップアプリをアンインストールした後、対応するボタンをタップした場合にどうなるか確認してみました。
外部ブラウザ(Safari)が起動しますが、こちらでも徒歩ルートが検索できています。
端末設定の「許可されたアプリと機能」で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マップアプリが起動し、徒歩でのルートが検索できました。
Googleマップアプリのアプリ情報からアプリを無効にした場合
Googleマップアプリのアプリ情報からアプリを無効にした場合はどうなるのか確認してみました。
外部ブラウザ(Chrome)が起動しますが、こちらでも徒歩ルートが検索できました。
Chromeのアプリ情報からアプリを無効にした場合
Chromeも無効にした場合はcanLaunchUrl
がfalseを返すようになります。
したがってChromeも起動できなくなります。
おわりに
url_launcherパッケージを使うことでFlutterアプリから端末にインストールされたマップアプリ起動して徒歩ルートを検索できました。
どなたかの参考になれば幸いです。
参考記事