درخواست به روز رسانی مکان

استفاده مناسب از اطلاعات مکان می تواند برای کاربران برنامه شما مفید باشد. به عنوان مثال، اگر برنامه شما به کاربر کمک می کند راه خود را در حین راه رفتن یا رانندگی پیدا کند، یا اگر برنامه شما مکان دارایی ها را ردیابی کند، باید مکان دستگاه را در فواصل زمانی منظم دریافت کند. علاوه بر موقعیت جغرافیایی (طول و عرض جغرافیایی)، ممکن است بخواهید اطلاعات بیشتری مانند بلبرینگ (جهت افقی حرکت)، ارتفاع یا سرعت دستگاه را به کاربر بدهید. این اطلاعات و موارد دیگر در شی Location موجود است که برنامه شما می تواند از ارائه دهنده مکان ترکیب شده بازیابی کند. در پاسخ، API برنامه شما را به صورت دوره‌ای با بهترین مکان موجود، بر اساس ارائه‌دهندگان موقعیت مکانی موجود مانند WiFi و GPS (سیستم موقعیت‌یابی جهانی) به‌روزرسانی می‌کند. دقت مکان توسط ارائه دهندگان، مجوزهای مکانی که درخواست کرده اید و گزینه هایی که در درخواست مکان تنظیم کرده اید تعیین می شود.

این درس به شما نشان می‌دهد که چگونه با استفاده از متد requestLocationUpdates() در ارائه‌دهنده مکان ادغام شده، به‌روزرسانی‌های منظم در مورد مکان دستگاه درخواست کنید.

آخرین مکان شناخته شده را دریافت کنید

آخرین مکان شناخته شده دستگاه، پایه ای مفید برای شروع فراهم می کند، و اطمینان حاصل می کند که برنامه قبل از شروع به روز رسانی های دوره ای مکان، مکان مشخصی دارد. درس دریافت آخرین مکان شناخته شده به شما نشان می دهد که چگونه با فراخوانی getLastLocation() آخرین مکان شناخته شده را بدست آورید. تکه‌های موجود در بخش‌های زیر فرض می‌کنند که برنامه شما قبلاً آخرین مکان شناخته شده را بازیابی کرده و آن را به عنوان یک شی Location در متغیر جهانی mCurrentLocation ذخیره کرده است.

درخواست مکان کنید

قبل از درخواست به‌روزرسانی موقعیت مکانی، برنامه شما باید به سرویس‌های مکان متصل شود و درخواست مکان ارائه کند. درس تغییر تنظیمات مکان به شما نشان می دهد که چگونه این کار را انجام دهید. هنگامی که درخواست موقعیت مکانی انجام شد، می توانید با فراخوانی requestLocationUpdates() به روز رسانی های معمولی را شروع کنید.

بسته به شکل درخواست، ارائه‌دهنده مکان ترکیب شده یا متد LocationCallback.onLocationResult() را فراخوانی می‌کند و فهرستی از اشیاء Location را به آن ارسال می‌کند یا یک PendingIntent صادر می‌کند که حاوی مکان در داده‌های توسعه‌یافته‌اش است. دقت و فراوانی به‌روزرسانی‌ها تحت تأثیر مجوزهای مکانی که درخواست کرده‌اید و گزینه‌هایی که در شی درخواست مکان تنظیم کرده‌اید، می‌شود.

این درس به شما نشان می‌دهد که چگونه می‌توانید با استفاده از رویکرد پاسخ به تماس LocationCallback به‌روزرسانی را دریافت کنید. requestLocationUpdates() فراخوانی کنید، آن را نمونه ای از شی LocationRequest و یک LocationCallback ارسال کنید. همانطور که در نمونه کد زیر نشان داده شده است، یک متد startLocationUpdates() تعریف کنید:

کاتلین

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

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

جاوا

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

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

توجه داشته باشید که قطعه کد بالا به یک پرچم منطقی، requestingLocationUpdates اشاره دارد، که برای ردیابی اینکه آیا کاربر به‌روزرسانی‌های مکان را روشن یا خاموش کرده است، استفاده می‌شود. اگر کاربران به‌روزرسانی‌های موقعیت مکانی را غیرفعال کرده‌اند، می‌توانید آن‌ها را از موقعیت مکانی برنامه‌تان مطلع کنید . برای اطلاعات بیشتر در مورد حفظ ارزش پرچم بولی در نمونه های فعالیت، به ذخیره وضعیت فعالیت مراجعه کنید.

پاسخ تماس به روز رسانی مکان را تعریف کنید

ارائه‌دهنده مکان ترکیبی متد LocationCallback.onLocationResult() فراخوانی می‌کند. آرگومان ورودی حاوی یک شی Location لیست است که شامل طول و عرض جغرافیایی مکان است. قطعه زیر نحوه پیاده‌سازی رابط LocationCallback و تعریف روش را نشان می‌دهد، سپس مهر زمانی به‌روزرسانی موقعیت مکانی را دریافت کرده و طول، طول و مهر زمان را در رابط کاربری برنامه خود نمایش می‌دهد:

کاتلین

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
                // ...
            }
        }
    }
}

جاوا

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 ارسال کنید:

کاتلین

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

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

جاوا

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

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

برای ردیابی اینکه آیا به‌روزرسانی‌های مکان در حال حاضر فعال هستند یا نه، از یک بولی، requestingLocationUpdates مکان استفاده کنید. در متد onResume() اکتیویتی، بررسی کنید که آیا به‌روزرسانی‌های مکان در حال حاضر فعال هستند یا خیر، و در غیر این صورت آن‌ها را فعال کنید:

کاتلین

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

جاوا

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

وضعیت فعالیت را ذخیره کنید

تغییر در پیکربندی دستگاه، مانند تغییر جهت صفحه یا زبان، می تواند باعث از بین رفتن فعالیت فعلی شود. بنابراین برنامه شما باید هر اطلاعاتی را که برای بازسازی فعالیت نیاز دارد ذخیره کند. یکی از راه‌های انجام این کار از طریق یک حالت نمونه ذخیره شده در یک شی Bundle است.

نمونه کد زیر نحوه استفاده از callback onSaveInstanceState() برای ذخیره وضعیت نمونه نشان می دهد:

کاتلین

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

جاوا

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

یک متد updateValuesFromBundle() برای بازیابی مقادیر ذخیره شده از نمونه قبلی اکتیویتی، در صورت موجود بودن، تعریف کنید. همانطور که در نمونه کد زیر نشان داده شده است، متد را از متد onCreate() فعالیت فراخوانی کنید:

کاتلین

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()
}

جاوا

@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.