Androidでインテントを介してGoogleマップルートを起動する


回答:


630

次のようなものを使用できます。

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"));

更新

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

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

新しいAPIでもインテントを使用できます。


2
私が知っていることではありません。ただし、ユーザーがこのタイプのインテントを開くためのデフォルトのアプリをすでにマップアプリとして選択している場合、ダイアログは表示されません。
Jan S.

111
ダイアログを取り除きたい場合は、どのパッケージを使用するかに関するヒントをインテントに与えることができます。startActivity()の前にこのアドオン: intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
ジェレミー・ローガン

そして、どうすればそれをナビゲーターに表示し、googlemapsアプリケーションには表示しないのですか?
NullPointerException

68
ユーザーが好む他のアプリを持っている可能性がある場合、ユーザーに特定のアクティビティを強制することは、Androidの精神を私にボルトで合わせることに反するようです。ここでインテントフィルターに処理を任せたいと思います。
スーパーミナミ

15
ナビゲーションインテントが正式にサポートされるようになりました:developer.google.com/maps/documentation/android/…–
Sanketh Katta 2015

124

「方向」を要求したため、これは少しトピックから外れていますが、Androidのドキュメントで説明されているGeo URIスキームを使用することもできます。

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

「geo:latitude、longitude」を使用した場合の問題は、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);

注(@TheNailによる):Maps v.7(執筆時の最新バージョン)では機能しません。座標を無視して、括弧内に指定された名前のオブジェクトを検索します。ロケーションを含むGoogle Maps 7.0.0のインテントも参照してください


3
デフォルトのgeo:0,0は、マップをそこに移動するだけです。このソリューション["geo:0,0?q = 37.423156、-122.084917(" + name + ")"]を使用すると、独自のマーカー名を入力できます。ありがとう。
gnac

4
うまくいく-fyiは "z"クエリパラメータ(ズームレベル)と連動して動作しないようです
scolestock

1
インテントでデフォルトのトランジットモードを設定することは可能ですか?デフォルトでは、車のオプションが選択されています。ウォーキングをデフォルトモードに設定できますか?
クマ

6
使ってみませんgeo:37.423156,-122.084917?q=37.423156,-122.084917 ...か?
2013年

1
必ずlabelパラメータをurlEncodeしてください。スペースなどの特殊文字に問題がありました。
イーサン、

100

現在の答えは素晴らしいですが、それらのどれも私が探していたものを完全に実行しませんでした、私はマップアプリのみを開き、ソースの場所と目的地のそれぞれに名前を追加したいのですが、geo URIスキームを使用すると機能しませんまったく、マップの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);

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

        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();
            }
        }

PS私の例で使用されている緯度または経度は私の場所を表すものではありません。実際の場所に似ていることは純粋に偶然であり、別名アフリカではありません:P

編集:

ルートについては、ナビゲーションインテントが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);

2
これは素晴らしい答えです。また、ナビゲーションアプリ内で実際にナビゲーションを開始する方法を知っていますか?現在の状態では、ユーザーは最後に「ナビゲーションの開始」をクリックする必要があります。渡すパラメーターをGoogleで検索しましたが、見つかりませんでした。
通常の

マップアプリから戻るボタンを押すと、黒い画面が表示され、基になるアクティビティが再作成されます。これを修正する方法はありますか?
Jas

@Jasはintent.setclassnameメソッドを削除
Ameen Maheen

こんにちは。上記のコードは、Androidバージョン4.4.2、4.4.4、および5.0.2でデフォルトのマップアプリを起動するのに時間がかかります。5.1とマシュマロバージョンでの起動に問題はありません。この問題の解決にご協力ください。
OnePunchMan 2017年

intent.setClassName( "com.google.android.apps.maps"、 "com.google.android.maps.MapsActivity");の代わりにintent.SetPackageを使用することをお勧めします。これを反映するように答えを更新します。
David Thompson

22

最新のクロスプラットフォームのGoogleマップURLを使用する:Googleマップアプリがない場合でも、ブラウザーで開きます

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

10

さまざまなモードでインテントを使用して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自転車用

グーグルマップを使用しインテントの詳細については、こちらをご覧ください

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

私の元の答えはここで確認できます


8

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

6

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

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

座標の最初のセットは、開始位置です。次のすべてはウェイポイントであり、プロットされたルートが通過します。

最後に「/ latitude、longitude」を連結してウェイポイントを追加してください。グーグルドキュメントによると、明らかに23ウェイポイントの制限があります。それがAndroidにも当てはまるかどうかはわかりません。


何が機能していませんか?この正確なコードを実行すると何が見えますか?
Adeel Tariq

実際にここで入力した正確な座標を使用しないでください。彼らはどこにも道のないどこかにいないので、それはうまくいきません。
Adeel Tariq 2017

4

現在の方向からの緯度と経度を表示することに興味がある場合は、これを使用できます。

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

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

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マップイン テント


方向性を機能させるために、私は追加する必要がありましたmapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Someone Somewhere

4

DirectionsView文字列として与えられた現在の場所と目的地の場所としてソースの場所を持つGoogle

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

これを試して

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

3

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

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);
}

1

ポイント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);

詳細については、このSOの回答を参照してください

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


1
マップアプリから戻るボタンを押すと、黒い画面が表示され、基になるアクティビティが再作成されます。これを修正する方法はありますか?
Jas

@ Jas、googleは多くのAPIを変更し、この動作も変更された可能性があります。私はかなり長い間、専用のオープンストリートマップを使用してきたので、あなたを助けることができます。:)
tony gil

0

最初に、暗黙のインテントを使用できるようにする必要があります。Androidドキュメントには 、2つのパラメーターで新しいインテントを作成するために必要なマップインテントを実装するための非常に詳細な共通インテントが用意されています

  • アクション
  • ウリ

使用できるアクション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);
    }

1
Uri.Builderの使用は、<scheme>://<authority><absolute path>?<query>#<fragment>不透明URIではなく、の形式の絶対URIに対してのみ機能します<scheme>:<opaque part>#<fragment>。上記のコードは次のURIを生成します。geo:/0%2C0?Eiffel%20Towerこれにより、Googleマップアプリがクラッシュします。公式ドキュメントでさえまさにこの理由でraw /不透明なURIを使用しています。正しいコードは次のようになりますUri.parse("geo:0,0?q=" + Uri.encode("Eiffel Tower"))
bitek

:また、あなたの答えは動作しない理由の説明のために、この答えを見るstackoverflow.com/a/12035226/313113
bitek

0

lakshman saiによって言及された最新のクロスプラットフォームの回答を使用した、素晴らしいkotlinソリューション...

不要なUri.toStringとUri.parseはありませんが、この答えは簡潔で最小限です。

 val intentUri = Uri.Builder().apply {
      scheme("https")
      authority("www.google.com")
      appendPath("maps")
      appendPath("dir")
      appendPath("")
      appendQueryParameter("api", "1")
      appendQueryParameter("destination", "${yourLocation.latitude},${yourLocation.longitude}")
 }.build()
 startActivity(Intent(Intent.ACTION_VIEW).apply {
      data = intentUri
 })

0

この方法でAndroidのインテントを介してGoogleマップのルートを起動できます

btn_search_route.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String source = et_source.getText().toString();
            String destination = et_destination.getText().toString();

            if (TextUtils.isEmpty(source)) {
                et_source.setError("Enter Soruce point");
            } else if (TextUtils.isEmpty(destination)) {
                et_destination.setError("Enter Destination Point");
            } else {
                String sendstring="http://maps.google.com/maps?saddr=" +
                        source +
                        "&daddr=" +
                        destination;
                Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
                        Uri.parse(sendstring));
                startActivity(intent);
            }
        }

    });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.