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();
        }
    }
Другие вопросы по тегам