Обнаружение конца навигации в Waze или Google Maps для мобильных устройств

Я хочу, чтобы мое мобильное приложение запускалось с помощью "завершения навигации" в любом приложении Waze или Google Maps. В нем простейшая форма, я хотел бы, чтобы мое приложение что-то делало, когда пользователь получил уведомление "Вы пришли в свое место назначения" из навигационного приложения.

Я понимаю, по крайней мере, в Android, что я могу начать навигацию (либо в Waze, либо в приложении Google Maps), создав намерение. Затем я могу запустить свой собственный датчик приближения в своем приложении, чтобы ждать прибытия пользователя. Тем не менее, я хотел что-то гораздо более чистое - ситуация, когда все, что требуется от пользователя, - это заставить мое приложение работать в фоновом режиме, а затем для этого приложения иметь возможность напрямую реагировать на событие прибытия.

Решения в iOS или Android очень приветствуются. Hacky-решения также приветствуются.

Спасибо

Ответы

Ответ 1

Простым решением будет создание GeoFence непосредственно перед запуском намерения для навигации. Вы можете прослушивать событие Geofence.GEOFENCE_TRANSITION_ENTER, используя службу намерений, работающую в фоновом режиме. Когда это событие произойдет, вы можете сделать все, что вам нужно сделать из класса обслуживания. Этот же принцип может быть реализован и в ios: Вот учебник по внедрению Geofence в ios http://www.raywenderlich.com/95014/geofencing-ios-swift и в android http://paulusworld.com/technical/android-geofences

Ответ 2

Супер хакерская вещь, которую вы могли бы сделать (почти не хотите публиковать это), заключалась бы в использовании NotificationListenerService и слежении за уведомлениями с карт google или waze.

http://developer.android.com/reference/android/service/notification/NotificationListenerService.html#nestedclasses

Я думаю, что это должно публично использовать, пока у вас есть разрешение.

Вам нужно будет подумать о чем-то умном для языков, возможно, о чтении ресурсов из приложений google maps/waze, чтобы вы не пропустили уведомления, которые не написаны на английском языке.

Это может быть жизнеспособным и для iOS: https://developer.apple.com/library/ios/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/Specification/Specification.html У меня нет личного опыта работы с часами Apis для iOS, вам придется копаться там сами.

Ответ 3

Единственное возможное решение здесь - опросить активные действия (переднего плана) каждые X секунд и действовать оттуда. Вы можете сделать это с помощью службы и тревоги.

Вы можете сделать это следующими способами:

Проверить текущие запущенные процессы:

 ActivityManager manager = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> processes = manager.getRunningAppProcesses();
    for (RunningAppProcessInfo process : processes) {
       if (processName.equals(process.processName)) {
           // do your thing
       }
    }

ИЛИ (менее предпочтительно) проверьте текущее приложение переднего плана:

ActivityManager am = (ActivityManager) context
                .getSystemService(Activity.ACTIVITY_SERVICE);
        String packageName = am.getRunningTasks(1).get(0).topActivity
                .getPackageName();

Ответ 4

В iOS я не уверен, что вы получите звонок из Google или Waze. лучший способ - использовать startMonitoringForRegion. если вы введете регион (пункт назначения), ваше приложение получит обратный вызов. если ваше приложение не работает, ОС запустит ваше приложение. надеюсь, что это поможет