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

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

概要

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

  1. 位置とズーム レベルを指定して地図を表示する。
  2. 位置やスポットを検索し、地図上に表示する。
  3. ある地点から別の地点への経路を要求する。ルート案内は、車、徒歩、自転車の 3 つの移動モードで返されます。
  4. Google ストリートビューにパノラマ画像を表示します。

このページでは、Android 向け Google マップ アプリで使用できるインテントについて説明します。インテントとインテント フィルタまたは Android プラットフォームに共通のインテントの詳細については、Android デベロッパー ドキュメントをご覧ください。

インテント リクエスト

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

  • アクション: すべての Google マップ インテントは、ビュー アクション(ACTION_VIEW)として呼び出されます。
  • URI: Google マップ インテントは、必要なアクションと、アクションの実行に使用するデータを指定する URL エンコードを使用します。
  • パッケージ: 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 will load 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 will load 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 マップは、条件に一致し、指定された経度と緯度の近くにある場所を検索します。位置が指定されていない場合、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)

サンフランシスコのレストランの検索

クエリ文字列とともにズーム パラメータを指定することで、検索結果をさらに限定できます。次の例では、ズーム 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' will return too many results
Uri gmmIntentUri = Uri.parse("geo:0,0?q=101+main+street");

Kotlin

// Searching for 'Main Street' will return 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 examples above

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 examples above

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

このインテントを使用して、指定された住所または座標へのターンバイターンのルート案内が示される、Google マップ ナビゲーションを起動します。ルート案内は、常にユーザーの現在地を起点として示されます。

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

パラメータ

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

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

    • d: 運転中(デフォルト)
    • 自転車の場合は b
    • l(オートバイ)
    • 徒歩: w
  • avoid は、ルートで避けるべき地物を設定します。avoid は省略可能で、次のうち 1 つ以上を設定できます。

    • 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)

タロンガ動物園へのルート案内

有料道路の通行料の支払いやフェリーの利用を希望しない場合は、これらを避けるようにルートをリクエストできます。

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 ストリートビューでは、対象地域全体について、指定した位置からのパノラマビューを提供しています。ユーザーから提供された Photo Sphereストリートビューの特別なコレクションも利用できます。

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 です。Google マップでは、panoidcbll の両方が指定された場合にパノラマ ID を使用します。パノラマ ID は、Android アプリで StreetViewPanoramaLocation オブジェクトから取得できます。

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

    • bearing: 北を起点とした時計回りの度数で、カメラのコンパス向首方向を示します。真北が 0、東が 90、南が 180、西が 270 です。bearing に渡される値は折り返されます。つまり、0°、360°、720° はすべて同じ方向を指します。bearing は、5 つのコンマ区切りの値のうち、2 番目の値として定義されます。
    • zoom: カメラのズームレベルを設定します。デフォルトのズームレベルは 0 に設定されています。zoom を 1 に設定すると、倍率が 2 倍になります。ズームは、0 と現在のパノラマの最大ズームレベルの間の範囲に固定されます。つまり、この範囲外の値は、範囲内にある最も近い極値に設定されます。たとえば、-1 の値は 0 に設定されます。zoom は、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 will angle 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 will angle 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)

ストリートビューのピラミッド