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

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

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

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

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

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

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

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

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

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

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

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

کاتلین

fun createLocationRequest() {
  val locationRequest = LocationRequest.Builder()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build()
}

جاوا

protected void createLocationRequest() {
  LocationRequest locationRequest = LocationRequest.Builder()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build();
}

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

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

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

پس از اتصال به خدمات Google Play و 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.
            }
        }
    }
});

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