Копирование вряд ли можно избежать, если вы хотите, чтобы он был в одном блоке памяти. Если выделенный фрагмент достаточно велик, вы могли бы использовать 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;
}
Вы можете использовать что-то вроде этого:
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.
Сначала вам нужно теперь, чтобы вы могли использовать неявное намерение, документация по 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);
}
если вы знаете точку 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
попробуйте это
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);
Откройте 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» - это для велосипеда.
Мы можем установить режим вождения, ходьбы и езды на велосипеде, используя:
Вы можете узнать больше о намерениях с помощью Google Maps здесь .
Примечание: если нет маршрута для велосипеда / автомобиля / прогулки, тогда он покажет вам «Не могу найти дорогу»
Вы можете проверить мой оригинальный ответ здесь . [+1112]
Вот что сработало для меня:
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);
}
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
строка является изменяемой, изменяемой по мере необходимости.
Для нескольких точек маршрута также могут быть использованы следующие.
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.
Ну, вы можете попробовать открыть встроенное приложение 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);
Использование последних кроссплатформенных 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);
Хотя текущие ответы великолепны, ни один из них не сделал то, что я искал, я хотел открыть только приложение карт, добавить имя для каждого исходного местоположения и пункта назначения, используя схему гео-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);
. Это немного не по теме, потому что вы спросили «указания», но вы также можете использовать схему 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 с местоположением
.Если вы заинтересованы в отображении широты и долготы от текущего направления, вы можете использовать это:
Направления всегда даются из текущего местоположения пользователя.
Следующий запрос поможет вам выполнить это. Вы можете передать широту и долготу назначения здесь:
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