طلب تعديلات على الموقع الجغرافي

قد يكون الاستخدام الملائم لمعلومات الموقع مفيدًا لمستخدمي التطبيق. على سبيل المثال، إذا كان تطبيقك يساعد المستخدم في معرفة طريقه أثناء المشي أو أو إذا كان تطبيقك يتتبع موقع مواد العرض، فإنه يحتاج إلى مكان الجهاز على فترات منتظمة. بالإضافة إلى الموقع الجغرافي الموقع (خط العرض وخط الطول)، فيمكنك منح المستخدم معلومات مثل الاتجاه (الاتجاه الأفقي للسفر) أو الارتفاع أو وسرعة الجهاز. تتوفر هذه المعلومات وغيرها في Location الذي يمكن لتطبيقك استرداده من خلال انصهار موفِّر الموقع الجغرافي. استجابةً لذلك، تحدّث واجهة برمجة التطبيقات تطبيقك بشكل دوري باستخدام أفضل موقع متاح، استنادًا إلى الموقع المتاح حاليًا شبكة الجوال مثل WiFi وGPS (نظام تحديد المواقع العالمي). تتيح دقة يتم تحديد الموقع من قبل مقدمي الخدمة، أذونات تحديد الموقع الجغرافي التي المطلوب، والخيارات التي أعددتها في طلب الموقع الجغرافي.

يوضح هذا الدرس كيفية طلب تحديثات منتظمة بشأن عمل الموقع باستخدام requestLocationUpdates() في موفر الموقع المدمج.

الحصول على آخر موقع جغرافي معروف

ويوفِّر آخر موقع جغرافي معروف للجهاز قاعدة سهلة الاستخدام يمكنك من خلالها التأكد من أن التطبيق له موقع معروف قبل بدء تحديثات الموقع الجغرافي الدورية. الدرس الذي يتناول يوضح لك الحصول على آخر موقع معروف كيف يمكنني الحصول على آخر موقع جغرافي معروف من خلال الاتصال getLastLocation() تفترض المقتطفات في الأقسام التالية أن تطبيقك قد آخر موقع معروف وتخزينه كائن Location في المتغيّر العمومي mCurrentLocation

تقديم طلب موقع جغرافي

قبل طلب إجراء تعديلات على الموقع الجغرافي، يجب أن يكون تطبيقك مرتبطًا بالموقع الجغرافي. والخدمات وطلب الموقع. الدرس الذي يتناول تغيير إعدادات الموقع الجغرافي كيفية القيام بذلك. بعد تقديم طلب الموقع الجغرافي، يمكنك البدء التحديثات المنتظمة من خلال الاتصال requestLocationUpdates()

وبناءً على شكل الطلب، يتولى موفّر الموقع الجغرافي المدمج إما يستدعي LocationCallback.onLocationResult() طريقة رد الاتصال وتمريرها قائمة من كائنات Location يصدر PendingIntent يحتوي على الموقع في بياناته الموسعة. دقة وتكرار تتأثر التحديثات بأذونات تحديد الموقع التي طلبتها الخيارات التي حددتها في كائن طلب الموقع.

يوضّح لك هذا الدرس كيفية الحصول على التحديث باستخدام LocationCallback معاودة الاتصال. اتصل requestLocationUpdates()، تمريره إلى المثيل الخاص بك LocationRequest كائن وLocationCallback. حدِّد طريقة startLocationUpdates() كما هو موضّح في نموذج الرمز التالي:

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

private fun startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper())
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

private void startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper());
}

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

تحديد معاودة الاتصال لتحديث الموقع الجغرافي

يستدعي موفِّر الموقع المدمج LocationCallback.onLocationResult() . تحتوي الوسيطة الواردة على قائمة Location عنصر يحتوي على خط العرض وخط الطول للموقع الجغرافي. المقتطف التالي كيفية تنفيذ LocationCallback وحدد الطريقة، ثم احصل على الطابع الزمني لتحديث الموقع وستعرض خطوط الطول والعرض والطابع الزمني لدى مستخدم تطبيقك :

Kotlin

private lateinit var locationCallback: LocationCallback

// ...

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    locationCallback = object : LocationCallback() {
        override fun onLocationResult(locationResult: LocationResult?) {
            locationResult ?: return
            for (location in locationResult.locations){
                // Update UI with location data
                // ...
            }
        }
    }
}

Java

private LocationCallback locationCallback;

// ...

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                return;
            }
            for (Location location : locationResult.getLocations()) {
                // Update UI with location data
                // ...
            }
        }
    };
}

إيقاف تحديثات الموقع الجغرافي

وضع في اعتبارك ما إذا كنت تريد إيقاف تحديثات الموقع الجغرافي عندما يكون النشاط التي لم تعد في بؤرة التركيز، مثلاً عندما ينتقل المستخدم إلى تطبيق آخر أو إلى نشاط مختلف في نفس التطبيق. يمكن أن يكون هذا مفيدًا لتقليل الطاقة استهلاك الطاقة، بشرط ألا يحتاج التطبيق إلى جمع معلومات حتى عند إنه يعمل في الخلفية. يوضح هذا القسم كيفية إيقاف الجديدة في النشاط طريقة onPause().

لإيقاف تحديثات الموقع الجغرافي، اتصل removeLocationUpdates()، تمريره LocationCallback, كما هو موضح في نموذج الرمز البرمجي التالي:

Kotlin

override fun onPause() {
    super.onPause()
    stopLocationUpdates()
}

private fun stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback)
}

Java

@Override
protected void onPause() {
    super.onPause();
    stopLocationUpdates();
}

private void stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback);
}

استخدام قيمة منطقية، requestingLocationUpdates، لتتبُّع ما إذا كانت تحديثات الموقع الجغرافي مفعّلة حاليًا أم لا. في النشاط طريقة واحدة (onResume())، يُرجى التحقّق منها ما إذا كانت تحديثات الموقع الجغرافي نشطة حاليًا، وتفعيلها إن لم تكن نشطة:

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

حفظ حالة النشاط

تغيير إعدادات الجهاز، مثل تغيير الشاشة الاتجاه أو اللغة، إلى تلف النشاط الحالي. وبالتالي إلى تخزين أي معلومات يحتاج إليها لإعادة إنشاء النشاط. ويمكن القيام بذلك عن طريق حالة مثيل مخزنة في عنصر Bundle.

يوضح نموذج الرمز البرمجي التالي كيفية استخدام واجهة برمجة التطبيقات onSaveInstanceState() معاودة الاتصال لحفظ حالة المثيل:

Kotlin

override fun onSaveInstanceState(outState: Bundle?) {
    outState?.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates)
    super.onSaveInstanceState(outState)
}

Java

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY,
            requestingLocationUpdates);
    // ...
    super.onSaveInstanceState(outState);
}

تحديد طريقة updateValuesFromBundle() لاستعادتها القيم المحفوظة من المثيل السابق للنشاط، إذا كانت المتوفرة. عليك استدعاء الطريقة من قائمة بيانات النشاط onCreate()، كما هو موضح في نموذج الرمز التالي:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    updateValuesFromBundle(savedInstanceState)
}

private fun updateValuesFromBundle(savedInstanceState: Bundle?) {
    savedInstanceState ?: return

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY)
    }

    // ...

    // Update UI to match restored state
    updateUI()
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    updateValuesFromBundle(savedInstanceState);
}

private void updateValuesFromBundle(Bundle savedInstanceState) {
    if (savedInstanceState == null) {
        return;
    }

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY);
    }

    // ...

    // Update UI to match restored state
    updateUI();
}

لمزيد من المعلومات عن حفظ حالة المثيل، يمكنك الاطّلاع على أجهزة Android مرجع فئة النشاط.

ملاحظة: للحصول على مساحة تخزين دائمة، يمكنك: تخزين الإعدادات المفضّلة للمستخدم في صفحة SharedPreferences ضبط الإعدادات المفضّلة المشتركة في طريقة onPause() الخاصة بنشاطك لاسترداد التفضيل في onResume(). لمزيد من المعلومات عن حفظ الإعدادات المفضّلة، يُرجى قراءة الحفظ مجموعات القيم الأساسية

مصادر إضافية

لمزيد من المعلومات، يمكنك الاستفادة من المراجع التالية:

نماذج

  • نموذج تطبيق لتوضيح تلقّي آخر المعلومات حول الموقع الجغرافي في نظام Android.