Запуск Google Maps Directions через намерение на Android

Копирование вряд ли можно избежать, если вы хотите, чтобы он был в одном блоке памяти. Если выделенный фрагмент достаточно велик, вы могли бы использовать memmove, чтобы сдвинуть исходную строку на длину того, что вы хотите добавить, а затем скопировать ее в начало, но я сомневаюсь, что это меньше " неуклюжим».

Что-то вроде этого:

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>


/* Prepends t into s. Assumes s has enough space allocated
** for the combined string.
*/
void prepend(char* s, const char* t)
{
    size_t len = strlen(t);
    size_t i;

    memmove(s + len, s, strlen(s) + 1);

    for (i = 0; i < len; ++i)
    {
        s[i] = t[i];
    }
}


int main()
{
    char* s = malloc(100);
    strcpy(s, "file");
    prepend(s, "dir/");

    printf("%s\n", s);
    return 0;
}
372
задан Reg Edit 5 April 2015 в 13:45
поделиться

13 ответов

Вы можете использовать что-то вроде этого:

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 Maps.

Это приведет к запуску Google Maps в режиме навигации напрямую:

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

ОБНОВЛЕНИЕ

В мае 2017 года Google запустил новый API для универсальной, кроссплатформенной URL-адреса Карт Google:

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

Также вы можете использовать Intents с новым API.

597
ответ дан xomena 5 April 2015 в 13:45
поделиться

Сначала вам нужно теперь, чтобы вы могли использовать неявное намерение, документация по Android предоставляет нам очень подробные общие намерения для реализации намерения карты, вам необходимо создать новое намерение с двумя параметрами

  • Действие
  • Ури

Для действия мы можем использовать Intent.ACTION_VIEW, а для Ури мы должны построить его, ниже я приложил пример кода для создания, сборки, начать деятельность.

 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);
    }
0
ответ дан Bachiri Taoufiq Abderrahman 5 April 2015 в 13:45
поделиться

если вы знаете точку 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

ПРИМЕЧАНИЕ. В этом примере используется файл примера, который (по состоянию на 13 марта) все еще находится в сети. если он отключился, найдите файл kml в сети и измените ваш URL

1
ответ дан Community 5 April 2015 в 13:45
поделиться

попробуйте это

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
ответ дан daker 5 April 2015 в 13:45
поделиться

Откройте Google Карты с помощью Intent с разными режимами:

Мы можем открыть приложение Google Maps с помощью намерения:

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 для езды на велосипеде

Вы можете узнать больше о намерениях с помощью Google Maps здесь .

Примечание: если нет маршрута для велосипеда / автомобиля / прогулки, тогда он покажет вам «Не могу найти дорогу»

Вы можете проверить мой оригинальный ответ здесь . [+1112]

3
ответ дан SANAT 5 April 2015 в 13:45
поделиться

Вот что сработало для меня:

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 5 April 2015 в 13:45
поделиться

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
ответ дан Cid 5 April 2015 в 13:45
поделиться

Для нескольких точек маршрута также могут быть использованы следующие.

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

Первый набор координат - это ваше начальное местоположение. Все следующие являются путевыми точками, прокладываемый маршрут проходит через.

Просто продолжайте добавлять путевые точки, указав в конце «/ широта, долгота». Существует, по-видимому, ограничение в 23 путевых точки согласно Google Docs . Не уверен, относится ли это и к Android.

5
ответ дан Adeel Tariq 5 April 2015 в 13:45
поделиться

Ну, вы можете попробовать открыть встроенное приложение Android Maps, используя метод Intent.setClassName.

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);
7
ответ дан gvlasov 5 April 2015 в 13:45
поделиться

Использование последних кроссплатформенных URL-адресов Карт Google : даже если приложение Google Maps отсутствует, оно откроется в браузере

Пример 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
ответ дан Yvette Colomb 5 April 2015 в 13:45
поделиться

Хотя текущие ответы великолепны, ни один из них не сделал то, что я искал, я хотел открыть только приложение карт, добавить имя для каждого исходного местоположения и пункта назначения, используя схему гео-URI. работать на меня вообще, и у веб-ссылки на карты не было ярлыков, поэтому я придумала это решение, которое, по сути, объединяет другие решения и комментарии, сделанные здесь, надеюсь, это будет полезно для других, просматривающих этот вопрос.

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, тогда мы сможем снова начать действие без ограничений приложения карт, мы можем быть почти уверены, что в конце мы никогда не доберемся до Toast, так как Интернет-браузер также является допустимым приложением для запуска этой схемы 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();
            }
        }

П.С. Любые широты или долготы, используемые в моем примере, не являются репрезентативными для моего местоположения, любое сходство с истинным местоположением является чистым совпадением, иначе я не из Африки: 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);
.
93
ответ дан Hassnain Jamil 5 April 2015 в 13:45
поделиться

Это немного не по теме, потому что вы спросили «указания», но вы также можете использовать схему Geo URI, описанную в документации Android:

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

Проблема с использованием «гео: широта, долгота» заключается в том, что Карты 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 с местоположением

.
117
ответ дан Community 5 April 2015 в 13:45
поделиться

Если вы заинтересованы в отображении широты и долготы от текущего направления, вы можете использовать это:

Направления всегда даются из текущего местоположения пользователя.

Следующий запрос поможет вам выполнить это. Вы можете передать широту и долготу назначения здесь:

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

Подробнее здесь: Google Maps Intents для Android

4
ответ дан WannaBeGeek 5 April 2015 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: