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

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

این درس به شما نشان می‌دهد که چگونه از Settings Client برای بررسی تنظیمات فعال استفاده کنید و پنجره‌ی تنظیمات موقعیت مکانی را برای کاربر نمایش دهید تا تنظیمات خود را با یک لمس به‌روزرسانی کند.

پیکربندی سرویس‌های موقعیت مکانی

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

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

تنظیم درخواست موقعیت مکانی

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

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

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

  • PRIORITY_BALANCED_POWER_ACCURACY - از این تنظیم برای درخواست دقت مکان در محدوده یک بلوک شهری استفاده کنید، که دقتی تقریباً ۱۰۰ متر است. این یک سطح تقریبی از دقت محسوب می‌شود و احتمالاً برق کمتری مصرف می‌کند. با این تنظیم، سرویس‌های مکان‌یابی احتمالاً از موقعیت‌یابی WiFi و دکل‌های سلولی استفاده می‌کنند. با این حال، توجه داشته باشید که انتخاب ارائه‌دهنده مکان‌یابی به عوامل بسیاری دیگر، مانند منابع موجود، بستگی دارد.
  • PRIORITY_HIGH_ACCURACY - از این تنظیم برای درخواست دقیق‌ترین موقعیت مکانی ممکن استفاده کنید. با این تنظیم، سرویس‌های موقعیت مکانی بیشتر احتمال دارد از GPS برای تعیین موقعیت مکانی استفاده کنند.
  • PRIORITY_LOW_POWER - از این تنظیم برای درخواست دقت در سطح شهر استفاده کنید، که دقتی تقریباً 10 کیلومتر است. این یک سطح تقریبی از دقت محسوب می‌شود و احتمالاً برق کمتری مصرف می‌کند.
  • 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 که در مانیفست برنامه تعریف کرده‌اید، و یک فاصله به‌روزرسانی سریع ۵۰۰۰ میلی‌ثانیه (۵ ثانیه)، باعث می‌شود ارائه‌دهنده مکان ادغام‌شده، به‌روزرسانی‌های مکانی را با دقت چند فوت برگرداند. این رویکرد برای برنامه‌های نقشه‌برداری که مکان را به‌صورت بلادرنگ نمایش می‌دهند، مناسب است.

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

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

پس از اتصال به سرویس‌های گوگل پلی و API سرویس‌های مکان، می‌توانید تنظیمات مکان فعلی دستگاه کاربر را دریافت کنید. برای انجام این کار، یک 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.
            }
        }
    }
});

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