Мы открываем навигацию Google Maps, мы используем координаты широты и долготы. Проблема в том, что адрес отображается неправильно, потому что он рассчитывается Google Maps на основе координат. Я не могу найти способ предоставить адрес, который у нас уже есть, наряду с координатами.
Координаты фактически основаны на самом поиске Google Maps, но когда координаты преобразуются обратно в адрес в Google Maps, отображается другой адрес.
Этот фрагмент кода исходит из приложения Flutter, но он все равно должен быть довольно понятным.
final intent = AndroidIntent(
action: 'action_view',
data:
'google.navigation:q=${destination.latitude},${destination.longitude}&mode=d',
package: 'com.google.android.apps.maps',
);
Пункт назначения:
{
"lat": 35.6533691,
"lng": 139.7694851,
"address": "5-1 Toyomicho, Chuo City, Tokyo 104-0055, Japan",
"name": "FamilyMart"
}
Документация Google Maps Intents для Android не предлагает никакой дополнительной помощи. В нем говорится, что вы можете предоставить либо адрес, либо координаты, и ни один из них не работает у нас правильно.
String strUri = "http://maps.google.com/maps?q=loc:" + latitude + "," + longitude + " (" + yourLocationName + ")";
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(strUri));
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
startActivity(intent);
Если я правильно помню, несколько лет назад можно было задать произвольное имя для локации. Сейчас это не работает, но имеет смысл: иначе пользователя можно ввести в заблуждение, показав ему какой-то адрес в полях ввода, и ориентироваться по совсем другим координатам. Вы правы: для случайного преобразования места широта/долгота в адрес и наоборот может привести к неправильному результату, но кажется, что для названных, широко известных мест, таких как «FamilyMart» (он отображается как POI «по умолчанию» на Google Maps) преобразование довольно точное . Попробуйте использовать «полный» адрес: не только значение адреса из строки "address": "5-1 Toyomicho, Chuo City, Tokyo 104-0055, Japan",
, но и название места из строки "name": "FamilyMart"
, объединенное с ним. Что-то вроде того:
"FamilyMart, 5-1 Toyomicho, Chuo City, Tokyo 104-0055, Japan"
и попробуйте запустить режим навигации с помощью «классического» намерения следующим образом:
Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("google.navigation:mode=d&q = "+Uri.encode("FamilyMart, 5-1 Toyomicho, Chuo City, Tokyo 104-0055, Japan")));
startActivity(intent);
или
final intent = AndroidIntent(
action: 'action_view',
data:
'google.navigation:q=${FULL_ADDRESS}&mode=d',
package: 'com.google.android.apps.maps',
);
Если не получается, то либо ориентироваться по координатам (без красивой подписи к названию локации), либо писать свой фрагмент, по аналогии со стандартными Google Maps.
Кроме того, вы можете разрешить пользователю запускать Направления навигации вручную из приложения Google Maps, вызываемого намеренно:
Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("geo:35.6533691+139.7694851?z=19&q = "+Uri.encode("FamilyMart, 5-1 Toyomicho, Chuo City, Tokyo 104-0055, Japan")));
startActivity(intent);
Он устанавливает карту в центре "FamilyMart, 5-1 Toyomicho, Chuo City, Tokyo 104-0055, Japan"
, которая находится на карте, видимой на экране при уровне масштабирования 19, рядом с центром в (35.6533691,139.7694851)
координатах широты и долготы.
Спасибо. Это не идеально, но я думаю, что это работает хорошо. Моя текущая логика будет заключаться в использовании имени и адреса, если у меня есть оба значения, в противном случае я использую координаты.
@GuyKogus Добро пожаловать! Во всяком случае, кажется, что теперь с Intents нет других способов.
Это не открывает направления навигации.