Android намерен открыть карты Waze и Google
Есть несколько похожих постов, но я не смог найти точного. По сути, я хочу открыть карты Google и Waze с одинаковым намерением. Сначала я попробовал это:
final String uri = String.format(Locale.ENGLISH, "geo:%f,%f", latitude, longitude);
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(intent);
Waze переместился прямо в нужное место, а карты Google открыли правильное место. потом я понял, что Google maps не ставит булавку на это местоположение, поэтому пользователю трудно точно знать, где оно находится. Поэтому я осмотрелся и понял, что для Google maps для этого требуется "? Q =..(label)"... Я изменил конструкцию uri на:
final String uri = String.format(Locale.ENGLISH, "geo:%f,%f?q=%f,%f (%s)", latitude, longitude, latitude, longitude, name);
Но затем Waze сделал 2 вещи: перешел в нужное место и запустил поиск по метке. Это потребовало от пользователя нажатия кнопки "Назад", чтобы закрыть экран результатов поиска и остаться с навигацией в нужном месте.
Я всюду искал ответ, но не смог найти решения, которое позволит достичь того и другого. Сначала я думал, что это невозможно, и у Waze есть ошибка... но потом я заметил, что мессенджер Facebook делает именно то, что я хочу. при нажатии на сообщение с указанием местоположения откроются оба приложения: у карт Google будет значок (с ярлыком), и Waze будет перемещаться прямо в это место без выполнения поиска.
Несколько вопросов по поводу вышеизложенного: 1. (Конечно) Как я могу этого достичь? 2. Как я могу узнать, как строится намерение мессенджера Facebook? (Могу ли я поймать его в любом случае) 3. В чем причина наличия метки только с "? Q =.."?
Спасибо
4 ответа
Не берите в голову. Я смог перехватить мессенджер Facebook с помощью приложения, представленного ниже, и решил, что URI должен выглядеть следующим образом:
String.format(Locale.ENGLISH, "geo:0,0?q=") + android.net.Uri.encode(String.format("%s@%f,%f", label, latitude, longitude), "UTF-8");
Приложение: https://play.google.com/store/apps/details?id=uk.co.ashtonbrsc.android.intentintercept&feature=search_result..
Спасибо
Следуя совету Нимрода, я установил приложение и перехватил намерение из функции определения местоположения WhatsApp. Вот полное намерение, проверенное на картах и waze:
String uri = "http://maps.google.com/maps?q=loc:"+latitude+","+longitude+" ("+label+")";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
intent.setFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
intent.setData(Uri.parse(uri));
startActivity(intent);
У меня была та же проблема: я хотел, чтобы навигационное приложение (каким бы оно ни было) показывало булавку (желательно с настраиваемой меткой) и было готово направить пользователя туда. Однако наличие метки в запросе приводило к тому, что некоторые приложения выполняли поиск или (что еще хуже) предполагали, что ближайший адрес соответствует метке, и отображали его как пункт назначения (игнорируя координаты). Итак, чтобы добиться надежного поведения, мне пришлось забыть об именованной метке, и в итоге я получил следующее:
final String geoIntentData = "geo:" + latitude + "," + longitude + "?q=" + latitude + "," + longitude;
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(geoIntentData));
Пока это работает во всех приложениях, которые я тестировал (Google Maps, Waze, Sygic, Moovit и даже Komoot и Windy Maps). Пожалуйста, дайте мне знать, если вы попробуете это решение, и оно не работает в другом приложении!
Мое окончательное решение для открытия приложений Waze и GoogleMap, чтобы получить направление (работает как очарование):
String uri = "";
Intent intent;
try {
uri = String.format(Locale.ENGLISH,"geo:" + location.getLat() + "," +location.getLng() + "?q=" + location.getLat()+","+location.getLng()+" ("+location.getName()+")");
intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} catch (ActivityNotFoundException ex) {
try {
Intent unrestrictedIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(unrestrictedIntent);
} catch (ActivityNotFoundException innerEx) {
getSnackbar(getResources().getString(R.string.map_install_application), Snackbar.LENGTH_LONG).show();
}
}