web-dev-qa-db-ja.com

AndroidのインテントからGoogle Maps Directionsを起動する

私のアプリはAからBまでのGoogleマップの方向を表示する必要がありますが、私は自分のアプリケーションにGoogleマップを入れたくありません。代わりに、Intentを使って起動したいのです。これは可能ですか?もしそうなら、どうですか?

368
Lars D

あなたはこのようなものを使うことができます:

Intent intent = new Intent(Android.content.Intent.ACTION_VIEW, 
    Uri.parse("http://maps.google.com/maps?saddr=20.344,34.34&daddr=20.5666,45.345"));
startActivity(intent);

現在の場所からナビゲーションを開始するには、saddrパラメータと値を削除します。

緯度と経度の代わりに実際の住所を使用することができます。ただし、これにより、ブラウザまたはGoogleマップのどちらで開くかを選択するダイアログが表示されます。

これは、ナビゲーションモードでGoogleマップを直接起動します。

Intent intent = new Intent(Android.content.Intent.ACTION_VIEW,
    Uri.parse("google.navigation:q=an+address+city"));

UPDATE

2017年5月、GoogleはユニバーサルでクロスプラットフォームのGoogle Maps URL用の新しいAPIを発表しました。

https://developers.google.com/maps/documentation/urls/guide

新しいAPIと一緒にIntentsを使うこともできます。

595
Jan S.

「道順」を要求したので、これは少し話題外ですが、Android Documentationに記載されているGeo URIスキームを使用することもできます。

http://developer.Android.com/guide/appendix/g-app-intents.html

"geo:緯度、経度"を使用した場合の問題は、Googleマップではピンやラベルが表示されずに、ユーザーの位置に集中することです。

特に正確な場所を指し示したり、方向を尋ねたりする必要がある場合、これは非常に混乱します。

ジオポイントにラベルを付けるためにクエリパラメータ "geo:lat、lon?q = name"を使用すると、検索にクエリが使用され、lat/lonパラメータが消えます。

地図を緯度/経度で中央揃えにしてカスタムラベルを付けてピンを表示する方法を見つけました。

Intent intent = new Intent(Android.content.Intent.ACTION_VIEW, 
Uri.parse("geo:0,0?q=37.423156,-122.084917 (" + name + ")"));
startActivity(intent);

注(by @TheNail):Maps v.7(執筆時点での最新バージョン)では動作しません。座標を無視し、かっこの間に指定された名前のオブジェクトを検索します。 Googleマップ7.0.0の場所付きの意図 も参照してください

117
Murphy

現在の答えは素晴らしいのですが、どれも私が探していたものとは全く違うものでした。私は地図アプリだけを開き、発信元の場所と目的地それぞれに名前を付けたいのです。まったく、そしてマップのWebリンクにはラベルが付いていなかったので、私はこの解決策を思いつきました。これは本質的にここで行われた他の解決策とコメントの融合です。

String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps?saddr=%f,%f(%s)&daddr=%f,%f (%s)", sourceLatitude, sourceLongitude, "Home Sweet Home", destinationLatitude, destinationLongitude, "Where the party is at");
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.Android.apps.maps");
startActivity(intent);

出発点としてあなたの現在の場所を使用するには(残念ながら私は現在の場所にラベルを付ける方法を見つけていません)それから以下を使用してください

String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps?daddr=%f,%f (%s)", destinationLatitude, destinationLongitude, "Where the party is at");
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.Android.apps.maps");
startActivity(intent);

完全を期すために、ユーザーがMapsアプリをインストールしていない場合は、ActivityNotFoundExceptionをキャッチすることをお勧めします。それから、Mapsアプリの制限なしでアクティビティを再開できます。インターネットブラウザはこのURLスキームを起動するための有効なアプリケーションでもあるので、最後にToastにアクセスしてください。

        String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps?daddr=%f,%f (%s)", 12f, 2f, "Where the party is at");
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
        intent.setPackage("com.google.Android.apps.maps");
        try
        {
            startActivity(intent);
        }
        catch(ActivityNotFoundException ex)
        {
            try
            {
                Intent unrestrictedIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
                startActivity(unrestrictedIntent);
            }
            catch(ActivityNotFoundException innerEx)
            {
                Toast.makeText(this, "Please install a maps application", Toast.LENGTH_LONG).show();
            }
        }

P.S私の例で使用されている緯度や経度は、私の居場所を代表するものではありません。実際の居場所と似ているのは純粋に偶然の一致です。

編集:

道順については、ナビゲーション目的がgoogle.navigationでサポートされるようになりました

Uri navigationIntentUri = Uri.parse("google.navigation:q=" + 12f +"," + 2f);//creating intent with latlng
Intent mapIntent = new Intent(Intent.ACTION_VIEW, navigationIntentUri);
mapIntent.setPackage("com.google.Android.apps.maps");
startActivity(mapIntent);
93
David Thompson
Uri.Builder directionsBuilder = new Uri.Builder()
        .scheme("https")
        .authority("www.google.com")
        .appendPath("maps")
        .appendPath("dir")
        .appendPath("")
        .appendQueryParameter("api", "1")
        .appendQueryParameter("destination", lat + "," + lon);

startActivity(new Intent(Intent.ACTION_VIEW, directionsBuilder.build()));
29
Igor Bubelov

最新のクロスプラットフォームのGoogleマップURLを使用する:グーグルマップアプリがなくてもブラウザで開くことができます

https://www.google.com/maps/dir/?api=1&Origin=81.23444,67.0000&destination=80.252059,13.060604

Uri.Builder builder = new Uri.Builder();
builder.scheme("https")
        .authority("www.google.com").appendPath("maps").appendPath("dir").appendPath("").appendQueryParameter("api", "1")
        .appendQueryParameter("destination", 80.00023 + "," + 13.0783);
String url = builder.build().toString();
Log.d("Directions", url);
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
15
lakshman sai

さてあなたはIntent.setClassNameメソッドを使って組み込みのアプリケーションAndroid Mapsを開くことを試みることができます。

Intent i = new Intent(Intent.ACTION_VIEW,Uri.parse("geo:37.827500,-122.481670"));
i.setClassName("com.google.Android.apps.maps",
    "com.google.Android.maps.MapsActivity");
startActivity(i);

複数のウェイポイントの場合は、以下も使用できます。

Intent intent = new Intent(Android.content.Intent.ACTION_VIEW, 
    Uri.parse("https://www.google.com/maps/dir/48.8276261,2.3350114/48.8476794,2.340595/48.8550395,2.300022/48.8417122,2.3028844"));
startActivity(intent);

最初の座標があなたの出発地です。次のすべてはウェイポイントです、プロットされたルートは通ります。

最後に「/緯度、経度」を連結してウェイポイントを追加し続けるだけです。 Googleドキュメント によると、明らかに23ウェイポイントの制限があります。それがAndroidにも当てはまるかどうかわからない。

4
Adeel Tariq

現在の方向から緯度と経度を表示したい場合は、これを使用できます。

道順は常にユーザーの現在地から与えられます。

次のクエリはそれを実行するのに役立ちます。目的地の緯度と経度をここで渡すことができます。

google.navigation:q=latitude,longitude

上記のように使用します。

Uri gmmIntentUri = Uri.parse("google.navigation:q=latitude,longitude");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.Android.apps.maps");
startActivity(mapIntent);

または場所を介して表示したい場合は、次のように使用します。

google.navigation:q=a+street+address

詳細情報はこちら: Android用Googleマップの目的

4
WannaBeGeek

現在の場所としての出発地と文字列として与えられる目的地としてのGoogle DirectionsView

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?f=d&daddr="+destinationCityName));
intent.setComponent(new ComponentName("com.google.Android.apps.maps", "com.google.Android.maps.MapsActivity"));
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}

上記のdestinationCityNameは、必要に応じてそれを修正した文字列です。

3
Ramesh kumar

これは私のために働いたものです:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://maps.google.co.in/maps?q=" + yourAddress));
if (intent.resolveActivity(getPackageManager()) != null) {
   startActivity(intent);
}
3
JediCate

モードを変えてインテントを使ってGoogleマップを開く:

インテントを使用してGoogleマップアプリを開くことができます。

val gmmIntentUri = Uri.parse("google.navigation:q="+destintationLatitude+","+destintationLongitude + "&mode=b")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.Android.apps.maps")
startActivity(mapIntent)

ここで、「mode = b」は自転車用です。

以下を使用して、運転モード、ウォーキングモード、および自転車モードを設定できます。

  • 運転のためのd
  • 歩くためのw
  • 自転車用b

グーグルマップ の意図についての詳細はこちら にあります。

注:自転車、車、散歩のルートがない場合は、「そこには道が見つかりません」と表示されます。

あなたは私の元の答え をここでチェックすることができます

3
SANAT

これを試して

Intent intent = new Intent(Android.content.Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?saddr="+src_lat+","+src_ltg+"&daddr="+des_lat+","+des_ltg));
intent.setClassName("com.google.Android.apps.maps", "com.google.Android.maps.MapsActivity");
startActivity(intent);
2

点A、点B(およびその間にある機能やトラック)がわかっている場合は、意図と一緒にKMLファイルを使用できます。

String kmlWebAddress = "http://www.afischer-online.de/sos/AFTrack/tracks/e1/01.24.Soltau2Wietzendorf.kml";
String uri = String.format(Locale.ENGLISH, "geo:0,0?q=%s",kmlWebAddress);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(intent);

詳しくは、 this SO answer をご覧ください。

注:この例では(mar13の時点で)まだオンラインのサンプルファイルを使用しています。オフラインになった場合は、オンラインでkmlファイルを見つけて、URLを変更します。

1
tony gil

最初に暗黙の目的を使用できるようになる必要があります。Androidのドキュメントでは、作成する必要がある地図の目的を実装するための非常に詳細な 共通の目的 を提供しています二つのパラメータを持つ新しい意図

  • アクション
  • ウリ

アクションにはIntent.ACTION_VIEWを使用でき、Uriにはそれをビルドする必要があります。その下に、アクティビティを作成、ビルド、開始するためのサンプルコードを添付しました。

 String addressString = "1600 Amphitheatre Parkway, CA";

    /*
    Build the uri 
     */
    Uri.Builder builder = new Uri.Builder();
    builder.scheme("geo")
            .path("0,0")
            .query(addressString);
    Uri addressUri = builder.build();
    /*
    Intent to open the map
     */
    Intent intent = new Intent(Intent.ACTION_VIEW, addressUri);

    /*
    verify if the devise can launch the map intent
     */
    if (intent.resolveActivity(getPackageManager()) != null) {
       /*
       launch the intent
        */
        startActivity(intent);
    }