تغییر تنظیمات مکان

اگر برنامه‌تان نیاز به درخواست مکان یا دریافت به‌روزرسانی‌های اجازه دارد، دستگاه باید تنظیمات سیستم مناسب را فعال کند، مانند اسکن GPS یا Wi-Fi. برنامه شما به‌جای فعال کردن مستقیم سرویس‌هایی مانند GPS دستگاه، سطح دقت/مصرف برق موردنیاز و فاصله زمانی به‌روزرسانی مطلوب را مشخص می‌کند و دستگاه به‌طور خودکار تغییرات مناسب را در تنظیمات سیستم اعمال می‌کند. این تنظیمات توسط شیء داده LocationRequest تعریف می‌شود.

این درس به شما نشان می‌دهد که چگونه از Settings Client استفاده کنید تا بررسی کنید کدام تنظیمات فعال هستند و کادر گفتگوی «تنظیمات مکان» را به کاربر نشان دهید تا تنظیماتش را با یک تک‌ضرب به‌روز کند.

پیکربندی خدمات مکان

برای استفاده از خدمات مکان ارائه‌شده توسط «خدمات Google Play» و ارائه‌دهنده مکان تلفیقی، برنامه‌تان را بااستفاده از Settings Client متصل کنید، سپس تنظیمات مکان فعلی را بررسی کنید و درصورت نیاز از کاربر بخواهید تنظیمات موردنیاز را فعال کند.

برنامه‌هایی که ویژگی‌هایشان از خدمات مکان استفاده می‌کند باید اجازه‌های مکان را درخواست کنند، که این امر به موارد استفاده آن ویژگی‌ها بستگی دارد.

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

برای ذخیره پارامترهای درخواست‌ها به ارائه‌دهنده مکان تلفیقی، یک LocationRequest ایجاد کنید. پارامترها سطح دقت درخواست‌های مکان را تعیین می‌کنند. برای جزئیات همه گزینه‌های دردسترس درخواست مکان، به مرجع کلاس LocationRequest مراجعه کنید. این درس فاصله به‌روزرسانی، سریع‌ترین فاصله به‌روزرسانی، و اولویت را به‌صورت زیر تنظیم می‌کند:

فاصله به‌روزرسانی
setIntervalMillis() - این روش نرخ را برحسب میلی‌ثانیه تنظیم می‌کند که برنامه‌تان ترجیح می‌دهد به‌روزرسانی‌های مکان را با آن نرخ دریافت کند. توجه داشته باشید که به‌روزرسانی‌های مکان ممکن است تاحدودی سریع‌تر یا کندتر از این نرخ باشد تا مصرف باتری بهینه شود، یا ممکن است اصلاً به‌روزرسانی‌ای وجود نداشته باشد (مثلاً اگر دستگاه اتصال نداشته باشد).
سریع‌ترین فاصله زمانی به‌روزرسانی
setMinUpdateIntervalMillis() - این روش سریع‌ترین نرخ را برحسب میلی‌ثانیه تنظیم می‌کند که برنامه شما می‌تواند به‌روزرسانی‌های مکان را مدیریت کند. مگر اینکه برنامه‌تان از دریافت به‌روزرسانی‌ها با سرعتی بیشتر از نرخ مشخص‌شده در setInterval() بهره‌مند شود، نیازی به فراخوانی این روش ندارید.
اولویت

setPriority() - این روش اولویت درخواست را تنظیم می‌کند، که به خدمات مکان «خدمات Google Play» راهنمایی قوی درباره اینکه از کدام منابع مکان استفاده کند می‌دهد. مقدارهای زیر پشتیبانی می‌شود:

  • PRIORITY_BALANCED_POWER_ACCURACY - از این تنظیم برای درخواست دقت مکان در حد یک بلوک شهری استفاده کنید که دقتی حدود ۱۰۰ متر است. این سطح دقت، سطح دقت تقریبی درنظر گرفته می‌شود و احتمالاً شارژ کمتری مصرف می‌کند. با این تنظیم، خدمات مکان احتمالاً از موقعیت‌یابی Wi-Fi و برج سلولی استفاده می‌کند. بااین‌حال، توجه داشته باشید که انتخاب ارائه‌دهنده مکان به عوامل متعدد دیگری بستگی دارد، مثلاً اینکه کدام منابع دردسترس هستند.
  • PRIORITY_HIGH_ACCURACY - از این تنظیم برای درخواست دقیق‌ترین مکان ممکن استفاده کنید. با این تنظیم، خدمات مکان بیشتر از GPS برای تعیین مکان استفاده می‌کنند.
  • PRIORITY_LOW_POWER - از این تنظیم برای درخواست دقت در سطح شهر استفاده کنید که دقت آن تقریباً ۱۰ کیلومتر است. این سطح دقت، دقت تقریبی درنظر گرفته می‌شود و احتمالاً شارژ کمتری مصرف می‌کند.
  • PRIORITY_PASSIVE - اگر می‌خواهید تأثیر ناچیزی بر مصرف باتری داشته باشید، اما می‌خواهید به‌روزرسانی‌های مکان را درصورت دردسترس بودن دریافت کنید، از این تنظیم استفاده کنید. با این تنظیم، برنامه شما هیچ به‌روزرسانی مکانی را راه‌اندازی نمی‌کند، اما مکان‌های راه‌اندازی‌شده توسط برنامه‌های دیگر را دریافت می‌کند.

درخواست مکان را ایجاد کنید و پارامترها را همان‌طور که در این نمونه کد نشان داده شده است تنظیم کنید:

کاتلین

  fun createLocationRequest() {
    val locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000)
        .setMinUpdateIntervalMillis(5000)
        .build()
}

جاوا

  protected void createLocationRequest() {
    LocationRequest locationRequest = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000)
            .setMinUpdateIntervalMillis(5000)
            .build();
}

اولویت PRIORITY_HIGH_ACCURACY، همراه با تنظیم اجازه ACCESS_FINE_LOCATION که در مانیفست برنامه تعریف کرده‌اید، و فاصله به‌روزرسانی سریع ۵۰۰۰ میلی‌ثانیه (۵ ثانیه)، باعث می‌شود ارائه‌دهنده مکان تلفیقی به‌روزرسانی‌های مکانی را برگرداند که تا چند فوت دقیق هستند. این رویکرد برای برنامه‌های نقشه‌برداری که مکان را به‌صورت هم‌زمان نمایش می‌دهند مناسب است.

نکته عملکرد: اگر برنامه‌تان پس‌از دریافت به‌روزرسانی مکان به شبکه دسترسی پیدا می‌کند یا کار طولانی‌مدت دیگری انجام می‌دهد، سریع‌ترین فاصله زمانی را روی مقدار کندتری تنظیم کنید. این اصلاح از دریافت به‌روزرسانی‌هایی که برنامه‌تان نمی‌تواند استفاده کند جلوگیری می‌کند. وقتی کار طولانی‌مدت انجام شد، سریع‌ترین فاصله را به مقدار سریع برگردانید.

دریافت تنظیمات مکان فعلی

پس‌از اتصال به «خدمات Google Play» و میانای برنامه‌سازی کاربردی خدمات مکان، می‌توانید تنظیمات مکان فعلی دستگاه کاربر را دریافت کنید. برای انجام این کار، LocationSettingsRequest.Builder ایجاد کنید و یک یا چند درخواست مکان اضافه کنید. تکه‌کد زیر نشان می‌دهد که چگونه درخواست مکان ایجادشده در مرحله قبلی را اضافه کنید:

کاتلین

val builder = LocationSettingsRequest.Builder()
        .addLocationRequest(locationRequest)

جاوا

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
     .addLocationRequest(locationRequest);

سپس بررسی کنید آیا تنظیمات مکان فعلی برآورده شده است یا نه:

کاتلین

val builder = LocationSettingsRequest.Builder()

// ...

val client: SettingsClient = LocationServices.getSettingsClient(this)
val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())

جاوا

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();

// ...

SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());

وقتی Task تکمیل شد، برنامه‌تان می‌تواند با نگاه کردن به کد وضعیت از شیء LocationSettingsResponse، تنظیمات مکان را بررسی کند. برای دریافت جزئیات بیشتر درباره وضعیت فعلی تنظیمات مکان مربوطه، برنامه‌تان می‌تواند روش getLocationSettingsStates() شیء LocationSettingsResponse را فراخوانی کند.

از کاربر خواسته می‌شود تنظیمات مکان را تغییر دهد

برای تعیین اینکه آیا تنظیمات مکان برای درخواست مکان مناسب است یا نه، OnFailureListener را به شیء Task که تنظیمات مکان را اعتبارسنجی می‌کند اضافه کنید. سپس بررسی کنید که آیا شیء Exception ارسال‌شده به روش onFailure() نمونه‌ای از کلاس ResolvableApiException است یا نه، که نشان می‌دهد تنظیمات باید تغییر کند. سپس، کادر گفتگویی را نمایش دهید که از کاربر درخواست می‌کند با فراخوانی startResolutionForResult() اجازه دهد تنظیمات مکان اصلاح شود.

تکه‌کد زیر نشان می‌دهد که چگونه می‌توان تعیین کرد که آیا تنظیمات مکان کاربر به سرویس‌های مکان اجازه می‌دهد LocationRequest ایجاد کنند یا نه، و همچنین چگونه می‌توان درصورت لزوم از کاربر برای تغییر تنظیمات مکان اجازه خواست:

کاتلین

task.addOnSuccessListener { locationSettingsResponse ->
    // All location settings are satisfied. The client can initialize
    // location requests here.
    // ...
}

task.addOnFailureListener { exception ->
    if (exception is ResolvableApiException){
        // Location settings are not satisfied, but this can be fixed
        // by showing the user a dialog.
        try {
            // Show the dialog by calling startResolutionForResult(),
            // and check the result in onActivityResult().
            exception.startResolutionForResult(this@MainActivity,
                    REQUEST_CHECK_SETTINGS)
        } catch (sendEx: IntentSender.SendIntentException) {
            // Ignore the error.
        }
    }
}

جاوا

task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
    @Override
    public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
        // All location settings are satisfied. The client can initialize
        // location requests here.
        // ...
    }
});

task.addOnFailureListener(this, new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        if (e instanceof ResolvableApiException) {
            // Location settings are not satisfied, but this can be fixed
            // by showing the user a dialog.
            try {
                // Show the dialog by calling startResolutionForResult(),
                // and check the result in onActivityResult().
                ResolvableApiException resolvable = (ResolvableApiException) e;
                resolvable.startResolutionForResult(MainActivity.this,
                        REQUEST_CHECK_SETTINGS);
            } catch (IntentSender.SendIntentException sendEx) {
                // Ignore the error.
            }
        }
    }
});

درس بعدی، درخواست به‌روزرسانی‌های مکان، به شما نشان می‌دهد چگونه به‌روزرسانی‌های دوره‌ای مکان را دریافت کنید.