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

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

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

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

آخرین موقعیت مکانی شناخته شده دستگاه، پایه و اساس مفیدی برای شروع فراهم می‌کند و تضمین می‌کند که برنامه قبل از شروع به‌روزرسانی‌های دوره‌ای موقعیت مکانی، موقعیت مکانی شناخته شده‌ای دارد. درس مربوط به دریافت آخرین موقعیت مکانی شناخته شده به شما نشان می‌دهد که چگونه با فراخوانی 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() مربوط به activity، بررسی کنید که آیا به‌روزرسانی‌های موقعیت مکانی در حال حاضر فعال هستند یا خیر، و در صورت فعال نبودن، آن‌ها را فعال کنید:

کاتلین

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

جاوا

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

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

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

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

کاتلین

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

برای اطلاعات بیشتر در مورد ذخیره وضعیت نمونه، به مرجع کلاس Activity اندروید مراجعه کنید.

نکته: برای ذخیره‌سازی پایدارتر، می‌توانید تنظیمات کاربر را در SharedPreferences برنامه خود ذخیره کنید. تنظیمات مشترک را در متد onPause() اکتیویتی خود تنظیم کنید و تنظیمات را در onResume() بازیابی کنید. برای اطلاعات بیشتر در مورد ذخیره تنظیمات، بخش «ذخیره مجموعه‌های کلید-مقدار» را مطالعه کنید.

منابع اضافی

برای کسب اطلاعات بیشتر، از منابع زیر بهره ببرید:

نمونه‌ها

  • نمونه برنامه برای نمایش دریافت به‌روزرسانی‌های موقعیت مکانی در اندروید.