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