الاستماع إلى أحداث التنقّل

يمكن لتطبيقك الاستماع إلى الأحداث التي تقع أثناء تنقّل المستخدم على طول مسار.

نظرة عامة

استخدِم الواجهات التالية للاستماع إلى أحداث التنقّل:

  • توفّر Navigator.ArrivalListener دالة الاستدعاء onArrival() التي يتم تشغيلها عند وصول الجهاز إلى وجهة معيّنة.
  • RoadSnappedLocationProvider.LocationListener توفّر دالة الاستدعاء onLocationChanged() التي يتم تشغيلها عند تغيير الموقع الجغرافي للجهاز.
  • Navigator.RemainingTimeOrDistanceChangedListener توفّر دالة الاستدعاء onRemainingTimeOrDistanceChanged() التي يتم تشغيلها عندما يتغيّر الوقت أو المسافة إلى الوجهة التالية بأكثر من مقدار معيّن.
  • Navigator.RouteChangedListener يوفّر دالة الاستدعاء onRouteChanged() التي يتم تشغيلها عند تغيير المسار.

الاطّلاع على الرمز

رصد الوصول إلى وجهة معيّنة

تشير الوجهة هنا إلى وجهة نهائية أو نقطة على المسار. لرصد الوصول، يمكنك استدعاء Navigator.addArrivalListener()، الذي يسجّل ردّ اتصال عندما يصل الجهاز إلى وجهة معيّنة.

عند الوصول، تُشغِّل حزمة تطوير البرامج (SDK) للتنقّل على أجهزة Android دالة الاستدعاء onArrival()، والتي يمكن استخدامها بعد ذلك إما لإيقاف الاتجاهات المفصّلة باستخدام Navigator.stopGuidance() أو للانتقال إلى النقطة التالية على المسار باستخدام Navigator.continueToNextDestination(). إذا كانت جلسة التنقّل تتضمّن وجهة واحدة فقط، أو إذا لم تتبقَّ أي وجهات في قائمة الوجهات، يؤدي استدعاء Navigator.continueToNextDestination() إلى إيقاف الإرشاد تلقائيًا.

عند استدعاء continueToNextDestination()، يتجاهل المتصفّح جميع المعلومات المتعلّقة بالوجهة السابقة. إذا أردت تحليل معلومات عن الجزء السابق من المسار، عليك استرداد المعلومات من المتصفّح قبل طلب continueToNextDestination().

لتجنُّب تسرُّب الذاكرة، عليك استدعاء removeArrivalListener(listener) عندما لا تحتاج إلى المستمع.

mNavigator.addArrivalListener(new Navigator.ArrivalListener() {
    @Override
    public void onArrival(ArrivalEvent arrivalEvent) {
        displayMessage("onArrival: You've arrived at a waypoint: "
                +   mNavigator.getCurrentRouteSegment().getDestinationWaypoint().getTitle(),
                DISPLAY_BOTH);
        // Start turn-by-turn guidance for the next leg of the route.
        if (arrivalEvent.isFinalDestination()) {
            displayMessage("onArrival: You've arrived at the final destination.",
                    DISPLAY_BOTH);
        } else {
            mNavigator.continueToNextDestination();
            mNavigator.startGuidance();
        }
    }
});

تلقّي إشعارات بشأن الموقع الجغرافي

احصل على RoadSnappedLocationProvider من NavigationApi، ثم اتصل بـ RoadSnappedLocationProvider.addLocationListener() للتسجيل في معاودة الاتصال عند تغيُّر الموقع الجغرافي للجهاز أو اتجاهه. يُرجى العِلم أنّ هذا الموقع الجغرافي يتم تثبيته على طريق، لذا قد يختلف عن الموقع الجغرافي الذي يعرضه موفِّر الموقع المدمج في واجهات برمجة التطبيقات للموقع الجغرافي في "خدمات Google Play".

توفّر حزمة تطوير البرامج (SDK) للتنقّل إشعارات بشأن الموقع الجغرافي كلما أمكن ذلك. عند توفّر إشعار بشأن الموقع الجغرافي، تُشغّل حزمة تطوير البرامج (SDK) للتنقّل دالة الاستدعاء onLocationChanged().

تكون الإشعارات بشأن رصد الموقع الجغرافي على الطريق مستقلة عن التنقّل، ويمكن أن تستمر حتى بعد توقّف التنقّل. قد يؤدي الاشتراك في الإشعارات بشأن الموقع الجغرافي إلى استنزاف البطارية أو تسرُّب الذاكرة أو جمع بيانات الموقع الجغرافي للجهاز بدون قصد إذا تركت الإشعارات بشأن الموقع الجغرافي قيد التشغيل في الخلفية. يمكنك استدعاء RoadSnappedLocationProvider.removeLocationListener عندما لا تكون بحاجة إلى المستمع.

mRoadSnappedLocationProvider =
        NavigationApi.getRoadSnappedLocationProvider(getApplication());
if (mRoadSnappedLocationProvider != null) {
    mRoadSnappedLocationProvider.addLocationListener(
            new RoadSnappedLocationProvider.LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    displayMessage("onLocationUpdated: Navigation engine has provided a new"
                                    +   " road-snapped location: "
                                    +   location.toString(),
                            DISPLAY_LOG);
                }
            });
} else {
    displayMessage("ERROR: Failed to get a location provider", DISPLAY_LOG);
}

تلقّي معلومات عن الوقت والمسافة

يمكنك استدعاء Navigator.addRemainingTimeOrDistanceChangedListener() للتسجيل في معاودة الاتصال عندما يتغيّر الوقت المتبقي (بالثواني) أو المسافة (بالأمتار) بأكثر من حدّ معيّن.

عندما يتجاوز التغيير في الوقت أو المسافة المقدار المحدّد، تُشغِّل حزمة تطوير البرامج (SDK) للتنقّل دالة الاستدعاء onRemainingTimeOrDistanceChanged().

للاطّلاع على الوقت والمسافة المتبقيَين، يمكنك استدعاء Navigator.getTimeAndDistanceList(). يُرجى العلم أنّ الأوقات والمسافات في القائمة تراكمية: فهي تعرض الوقت والمسافة من الموقع الحالي إلى كل نقطة على المسار، وليس من نقطة على المسار إلى أخرى. يعرض عنصر TimeAndDistance أيضًا delaySeverity. هذا التعداد هو إما HEAVY أو MEDIUM أو LIGHT أو UNKNOWN. ويتوافق ذلك مع اللون الذي يظهر للوقت المقدَّر للوصول في واجهة مستخدم "خرائط Google" (اللون الأحمر يشير إلى حركة مرور كثيفة، واللون الأصفر يشير إلى حركة مرور متوسطة، واللون الأخضر يشير إلى حركة مرور خفيفة). يكون ذلك مفيدًا إذا كنت بحاجة إلى إنشاء تذييل ETA خاص بك.

لتجنُّب تسرُّب الذاكرة، عليك استدعاء Navigator.removeRemainingTimeOrDistanceChangedListener(listener) عندما لا تكون بحاجة إلى المستمع.

يطلب النموذج التالي معاودة الاتصال إذا تغيّر الوقت المتبقي بأكثر من 60 ثانية أو تغيّرت المسافة المتبقية بأكثر من 100 متر.

mNavigator.addRemainingTimeOrDistanceChangedListener(60, 100,
        new Navigator.RemainingTimeOrDistanceChangedListener() {
            @Override
            public void onRemainingTimeOrDistanceChanged() {
                displayMessage("onRemainingTimeOrDistanceChanged: Time or distance estimate"
                        +   " has changed.",
                        DISPLAY_LOG);
            }
        });

يمكنك عرض معلومات الوقت والمسافة المتبقيَين باستخدام الشاشة المدمجة من خلال طريقة setEtaCardEnabled() وتمرير مَعلمة بالقيمة TRUE. لإخفاء عرض الوقت والمسافة، اضبط هذه القيمة على FALSE.

يمكنك أيضًا عرض الوقت المتوقّع للوصول إلى نقاط متعددة على المسار باستخدام الطريقة getTimeAndDistanceList().

تلقّي آخر الأخبار عن المسار

اتصل بالرقم Navigator.addRouteChangedListener() للتسجيل في خدمة معاودة الاتصال عند تغيير المسار.

عندما يتغيّر المسار، تُشغّل حزمة Navigation SDK دالة الاستدعاء onRouteChanged(). يمكنك استدعاء Navigator.getRouteSegments و Navigator.getCurrentRouteSegment() للعثور على المسار الجديد.

لتجنُّب تسرُّب الذاكرة، عليك استدعاء removeRouteChangedListener(listener) عندما لا تحتاج إلى المستمع.

mNavigator.addRouteChangedListener(new Navigator.RouteChangedListener() {
    @Override
    public void onRouteChanged() {
        displayMessage("onRouteChanged: The driver's route has changed. Current waypoint: "
                +   mNavigator.getCurrentRouteSegment().getDestinationWaypoint().getTitle(),
                DISPLAY_LOG);
    }
});

رصد تغييرات "الوضع الليلي"

يُرجى الاتصال بالرقم NavigationView.addOnNightModeChangedListener أو NavigationFragment.addOnNightModeChangedListener للتسجيل من أجل تلقّي مكالمة عندما يتغيّر الوضع الليلي.

يوضّح المثال التالي كيفية الاستماع إلى تغييرات الوضع الليلي في جزء التنقّل.

mNavFragment.addOnNightModeChangedListener(new NavigationView.OnNightModeChangedListener() {
    @Override
    public void onNightModeChanged(NightModeChangedEvent nightModeChangedEvent) {
        displayMessage("Night mode is active: " + nightModeChangedEvent.inNightMode(),
        DISPLAY_LOG);
    }
});

يمكنك أيضًا ضبط "الوضع الليلي" آليًا. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة ضبط الوضع الليلي.