Android 向け Google マップ インテント

Android 向け Google マップ アプリには、表示モード、検索モード、ナビゲーション モード、ストリートビュー モードで Google マップを起動するために使用できる複数のインテントが公開されています。アプリに地図を埋め込むには、Maps SDK for Android のクイックスタートをご覧ください。

Android Automotive OS(AAOS)プラットフォームには、特定の考慮事項と利用可能な追加のインテントがあります。詳しくは、Android Automotive 向け Google マップ インテントのドキュメントをご覧ください。

概要

インテントを使用すると、Intent オブジェクトで実行するアクション(「地図を表示する」、「空港までのルートを表示する」など)を記述して、別のアプリでアクティビティを開始できます。Android 向け Google マップ アプリでは、複数のインテントがサポートされており、Google マップ アプリを起動して次の 4 つのアクションのいずれかを実行できます。

  1. 指定した場所とズームレベルで地図を表示します。
  2. 場所を検索して地図上に表示します。
  3. ある場所から別の場所への経路をリクエストします。経路は、車、徒歩、自転車の 3 つの移動手段で返すことができます。
  4. Google ストリートビューでパノラマ画像を表示する。

このページでは、Android 版 Google マップ アプリで使用できるインテントについて説明します。インテントについて詳しくは、インテントとインテント フィルタ一般的なインテントをご覧ください。

インテント リクエスト

インテントを使用して Google マップを起動するには、まず Intent オブジェクトを作成し、そのアクション、URI、パッケージを指定する必要があります。

  • アクション: すべての Google マップのインテントは、ビュー アクション(ACTION_VIEW)として呼び出されます。
  • URI: Google マップのインテントでは、選択したアクションと、そのアクションを実行するためのデータを指定する URL エンコードされた URI が使用されます。
  • パッケージ: setPackage("com.google.android.apps.maps") を呼び出すと、Android 版 Google マップ アプリがインテントを処理します。パッケージが設定されていない場合、Intent を処理できるアプリがシステムによって決定されます。複数のアプリが使用可能な場合は、どのアプリを使用するかをユーザーに尋ねることがあります。

Intent を作成したら、さまざまな方法で関連アプリを起動するようシステムにリクエストできます。一般的な方法は、IntentstartActivity() メソッドに渡すことです。システムは必要なアプリ(この場合は Google マップ)を起動し、対応する Activity を開始します。

Java

// Create a Uri from an intent string. Use the result to create an Intent.
Uri gmmIntentUri = Uri.parse("google.streetview:cbll=46.414382,10.013988");
// Create an Intent from gmmIntentUri. Set the action to ACTION_VIEW
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
// Make the Intent explicit by setting the Google Maps package
mapIntent.setPackage("com.google.android.apps.maps");
// Attempt to start an activity that can handle the Intent
startActivity(mapIntent);

Kotlin

// Create a Uri from an intent string. Use the result to create an Intent.
val gmmIntentUri = Uri.parse("google.streetview:cbll=46.414382,10.013988")
// Create an Intent from gmmIntentUri. Set the action to ACTION_VIEW
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
// Make the Intent explicit by setting the Google Maps package
mapIntent.setPackage("com.google.android.apps.maps")
// Attempt to start an activity that can handle the Intent
startActivity(mapIntent)

インテントに応答できるアプリをシステムが特定できない場合、アプリがクラッシュする可能性があります。そのため、これらのインテントのいずれかをユーザーに提示する前に、受信側のアプリがインストールされていることを確認してください。

インテントを受け取るアプリが利用可能かどうかを確認するには、Intent オブジェクトで resolveActivity() を呼び出します。結果が null でない場合、インテントを処理できるアプリが少なくとも 1 つあり、startActivity() を安全に呼び出すことができます。結果が null の場合は、そのインテントを使用せず、可能であれば、そのインテントを呼び出す機能を無効にします。

Java

if (mapIntent.resolveActivity(getPackageManager()) != null) {
    ...
}

Kotlin

mapIntent.resolveActivity(packageManager)?.let {
    ...
}

たとえば、サンフランシスコの地図を表示するには、次のコードを使用します。

Java

Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
if (mapIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(mapIntent);
}

Kotlin

val gmmIntentUri = Uri.parse("geo:37.7749,-122.4194")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
mapIntent.resolveActivity(packageManager)?.let {
    startActivity(mapIntent)
}

URL エンコードされたクエリ文字列

Google マップ インテントに渡す文字列はすべて URI エンコードする必要があります。たとえば、1st & Pike, Seattle という文字列は 1st%20%26%20Pike%2C%20Seattle にする必要があります。文字列内のスペースは、%20 でエンコードするか、プラス記号(+)に置き換えることができます。

android.net.Uri parse() メソッドを使用して文字列をエンコードできます。次に例を示します。

Java

Uri gmmIntentUri =
    Uri.parse("geo:37.7749,-122.4192?q=" + Uri.encode("1st & Pike, Seattle"));

Kotlin

val gmmIntentUri =
    Uri.parse("geo:37.7749,-122.4192?q=" + Uri.encode("1st & Pike, Seattle"))

地図を表示する

geo: インテントを使用して、指定した位置とズームレベルで地図を表示します。

geo:latitude,longitude?z=zoom

パラメータ

  • latitudelongitude は地図の中心点を設定します。
  • z は、必要に応じて地図の初期ズームレベルを設定します。指定できる値の範囲は 0(世界全体)~ 21(個々の建物)です。上限は、選択した場所で利用可能な地図データによって異なる場合があります。

Java

// Creates an Intent that loads a map of San Francisco
Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Kotlin

// Creates an Intent that loads a map of San Francisco
val gmmIntentUri = Uri.parse("geo:37.7749,-122.4194")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

場所を検索

このインテントを使用すると、指定したビューポート内に検索クエリを表示できます。クエリの結果が 1 件の場合は、このインテントを使用して、ランドマーク、ビジネス、地形、町などの特定の場所または住所にピンを表示できます。

geo:latitude,longitude?q=query
geo:0,0?q=my+street+address
geo:0,0?q=latitude,longitude(label)

パラメータ

地図の表示に使用されるパラメータに加えて、検索では次のパラメータがサポートされています。

  • q は、地図上でハイライト表示する場所を定義します。q パラメータは、すべての検索リクエストで必須です。場所は、場所の名前または住所として指定できます。文字列は URL エンコードされている必要があります。そのため、City Hall, New York, NY などのアドレスは City+Hall,New+York,NY に変換する必要があります。

  • label を使用すると、地図上で特定した場所にカスタムラベルを設定できます。label は文字列として指定する必要があります。

一般的な検索語句を渡すと、指定した緯度と経度の近くで、指定した条件に一致する場所が検索されます。場所が指定されていない場合、Google マップは近くのリスティングを検索します。次に例を示します。

Java

// Search for restaurants nearby
Uri gmmIntentUri = Uri.parse("geo:0,0?q=restaurants");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
// Search for restaurants in San Francisco.
Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194?q=restaurants");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Kotlin

// Search for restaurants nearby.
val gmmIntentUri = Uri.parse("geo:0,0?q=restaurants")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)
// Search for restaurants in San Francisco.
val gmmIntentUri =
    Uri.parse("geo:37.7749,-122.4194?q=restaurants")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)
サンフランシスコのレストランを検索する
図 1. サンフランシスコのレストランを検索する

クエリ文字列とともにズーム パラメータを指定することで、検索結果をさらにバイアスできます。次の例では、10 倍のズームを追加して、近くではなく都市レベルでレストランを検索しようとしています。

Java

Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194?z=10&q=restaurants");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Kotlin

val gmmIntentUri =
    Uri.parse("geo:37.7749,-122.4194?z=10&q=restaurants")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

特定の住所を検索すると、その場所にピンが表示されます。

Java

Uri gmmIntentUri = Uri.parse("geo:0,0?q=1600 Amphitheatre Parkway, Mountain+View, California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Kotlin

val gmmIntentUri =
    Uri.parse("geo:0,0?q=1600 Amphitheatre Parkway, Mountain+View, California")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

上の例では、緯度と経度を 00 に設定していますが、住所をクエリ文字列として渡しています。特定の場所を検索する場合、緯度と経度は必要ありません。ただし、正確な住所がわからない場合は、座標を指定して検索結果を絞り込むことができます。たとえば、「Main Street」で住所を検索すると、結果が多すぎる可能性があります。

Java

// Searching for 'Main Street' returns too many results.
Uri gmmIntentUri = Uri.parse("geo:0,0?q=101+main+street");

Kotlin

// Searching for 'Main Street' returns too many results.
val gmmIntentUri = Uri.parse("geo:0,0?q=101+main+street")

インテント URI に緯度と経度を追加すると、特定の地域に結果が偏ります。

Java

// Searches for 'Main Street' near San Francisco.
Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194?q=101+main+street");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Kotlin

// Searches for 'Main Street' near San Francisco.
val gmmIntentUri =
    Uri.parse("geo:37.7749,-122.4194?q=101+main+street")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

検索で 1 つの値が返されることがわかっている場合は、オプションのラベルを渡すことができます。ラベルは文字列として指定し、地図マーカーの下に表示する必要があります。ラベルは、q が緯度と経度の座標として指定されている場合にのみ使用できます。

Java

// Display a label at the location of Google's Sydney office.
Uri gmmIntentUri = Uri.parse("geo:0,0?q=Google+Sydney@-33.8666,151.1957");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Kotlin

// Display a label at the location of Google's Sydney office.
val gmmIntentUri =
    Uri.parse("geo:0,0?q=-33.8666,151.1957(Google+Sydney)")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

住所や緯度と経度の代わりに、Plus Code を使用して既知の場所のピンを表示できます。

Java

// Display the location of Google, San Francisco using a global plus code.
Uri gmmIntentUri = Uri.parse("http://plus.codes/849VQJQ5+XX");
// Equivalently, define the same location using a local plus code.
gmmIntentUri = Uri.parse("https://plus.codes/QJQ5+XX,San%20Francisco");
// Construct and use the Intent as in the preceding examples.

Kotlin

// Display the location of Google, San Francisco using a global plus code.
var gmmIntentUri = Uri.parse("http://plus.codes/849VQJQ5+XX")
// Equivalently, define the same location using a local plus code.
gmmIntentUri = Uri.parse("https://plus.codes/QJQ5+XX,San%20Francisco")
// Construct and use the Intent as in the preceding examples.

ターンバイターン方式のナビを起動する

このインテント URI を使用すると、指定された住所または座標へのルート案内付きの Google マップ ナビゲーションを起動できます。ルート案内は常にユーザーの現在地から開始されます。

google.navigation:q=a+street+address
google.navigation:q=latitude,longitude  

パラメータ

  • q: ナビゲーション検索のエンドポイントを設定します。この値には、緯度と経度の座標またはクエリ形式の住所を指定できます。複数の結果を返すクエリ文字列の場合は、最初の結果が選択されます。

  • mode は移動手段を設定します。mode は省略可能で、次のいずれかに設定できます。

    • d: 運転中(デフォルト)
    • 自転車の場合は b
    • オートバイの場合は l
    • 徒歩: w
  • avoid は、ルートが避けるべき特徴を設定します。avoid は省略可能で、次のいずれかに設定できます。

    • t: 有料道路
    • h: 高速道路
    • フェリーの場合は f

次の Intent は、オーストラリアのシドニーにあるタロンガ動物園へのターンバイターン ナビゲーションをリクエストします。

Java

Uri gmmIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Kotlin

val gmmIntentUri =
    Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)
タロンガ動物園への行き方
図 2. タロンガ動物園までのルート

通行料を支払ったりフェリーに乗ったりしたくない場合は、それらを避けるルートをリクエストできます。

Java

Uri gmmIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia&avoid=tf");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Kotlin

val gmmIntentUri =
    Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia&avoid=tf")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

運動を兼ねて移動したい場合は、自転車ルートをリクエストすることもできます。

Java

Uri gmmIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia&mode=b");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Kotlin

val gmmIntentUri =
    Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia&mode=b")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

原動機付自転車を使用する場合は、車では通行できない狭い道路やトレイルを経由するルートをリクエストできます。次の intent は、インドのルートを返します。

Java

Uri gmmIntentUri = Uri.parse("google.navigation:q=Connaught+Place,+New+Delhi,Delhi&mode=l");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Kotlin

val gmmIntentUri =
    Uri.parse("google.navigation:q=Connaught+Place,+New+Delhi,Delhi&mode=l")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)

ストリートビュー パノラマを表示する

google.streetview インテントを使用して Google ストリートビューを起動します。Google ストリートビューは、対象地域全体について、指定された場所からのパノラマビューを提供します。ユーザー作成のフォトスフィアストリートビューの特別なコレクションも利用できます。

google.streetview:cbll=latitude,longitude&cbp=0,bearing,0,zoom,tilt
google.streetview:panoid=id&cbp=0,bearing,0,zoom,tilt

パラメータ

すべての google.streetview URI には、cbll パラメータまたは panoid パラメータのいずれかを含める必要があります。

  • cbll は、緯度と経度をカンマ区切りの値(46.414382,10.013988)として受け取ります。アプリには、この場所に最も近い撮影されたパノラマが表示されます。ストリートビュー画像は定期的に更新され、撮影される写真は毎回少しずつ異なる位置から撮影されるため、画像が更新されると、位置が別のパノラマにスナップされることがあります。

  • panoid は特定のパノラマ ID です。panoidcbll の両方が指定されている場合、Google マップはパノラマ ID を使用します。パノラマ ID は、Android アプリで StreetViewPanoramaLocation オブジェクトから利用できます。

  • cbp は、カメラの初期の向きを調整するオプションのパラメータです。cbp パラメータには、カンマ区切りの 5 つの値を指定します。これらの値はすべて省略可能です。最も重要な値は 2 番目、4 番目、5 番目で、それぞれ方位、ズーム、傾斜を設定します。最初の値と 3 番目の値はサポートされていないため、0 に設定する必要があります。

    • bearing: カメラのコンパス方位を、北からの時計回りの度数で示します。真北が 0、東が 90、南が 180、西が 270 です。
      1. ベアリング ラップに変換される値。0°、360°、720° はすべて同じ方向を向いています。方位は、カンマ区切りの 5 つの値の 2 番目として定義されます。
    • zoom: カメラのズームレベルを設定します。デフォルトのズームレベルは 0 に設定されています。ズーム 1 は倍率を 2 倍にします。ズームは、現在のパノラマの最大ズームレベルと 0 の間でクランプされます。つまり、この範囲外の値は、範囲内の最も近い極端な値に設定されます。たとえば、値 -1 は 0 に設定されます。ズームは、カンマ区切りの 5 つの値の 4 番目です。
    • tilt: カメラの角度(上または下)を指定します。範囲は -90 から 0 を経て 90 までです。90 を指定すると真下を向き、0 は水平を向き、-90 では真上を向きます。

ストリートビュー インテントの使用例を次に示します。

Java

// Displays an image of the Swiss Alps.
Uri gmmIntentUri = Uri.parse("google.streetview:cbll=46.414382,10.013988");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
// Uses a PanoID to show an image from Maroubra beach in Sydney, Australia.
Uri gmmIntentUri = Uri.parse("google.streetview:panoid=Iaa2JyfIggYAAAQfCZU9KQ");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
// Opens Street View between two Pyramids in Giza. The values passed to the
// cbp parameter angles the camera slightly up, and towards the east.
Uri gmmIntentUri = Uri.parse("google.streetview:cbll=29.9774614,31.1329645&cbp=0,30,0,0,-15");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

Kotlin

// Displays an image of the Swiss Alps.
val gmmIntentUri =
    Uri.parse("google.streetview:cbll=46.414382,10.013988")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)
// Uses a PanoID to show an image from Maroubra beach in Sydney, Australia.
val gmmIntentUri =
    Uri.parse("google.streetview:panoid=Iaa2JyfIggYAAAQfCZU9KQ")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)
// Opens Street View between two Pyramids in Giza. The values passed to the
// cbp parameter angles the camera slightly up, and towards the east.
val gmmIntentUri =
    Uri.parse("google.streetview:cbll=29.9774614,31.1329645&cbp=0,30,0,0,-15")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
startActivity(mapIntent)
ストリートビューのピラミッド
図 3. ストリートビューのピラミッド