Thay đổi chế độ cài đặt vị trí

Nếu ứng dụng của bạn cần yêu cầu thông tin vị trí hoặc cần nhận thông tin cập nhật về quyền, thì thiết bị phải bật chế độ cài đặt hệ thống thích hợp, chẳng hạn như quét tìm Wi-Fi hoặc GPS. Thay vì bật trực tiếp các dịch vụ như GPS của thiết bị, ứng dụng của bạn sẽ chỉ định mức độ chính xác/mức tiêu thụ pin yêu cầu và khoảng thời gian giữa những lần cập nhật mong muốn, rồi thiết bị sẽ tự động thay đổi chế độ cài đặt hệ thống sao cho thích hợp. Các chế độ cài đặt này do đối tượng dữ liệu LocationRequest xác định.

Bài học này sẽ hướng dẫn bạn cách sử dụng Ứng dụng cài đặt để kiểm tra xem chế độ cài đặt nào được bật, cũng như cách hiển thị hộp thoại Cài đặt vị trí để người dùng cập nhật chế độ cài đặt chỉ bằng một lần nhấn.

Định cấu hình dịch vụ vị trí

Để sử dụng dịch vụ vị trí do Dịch vụ Google Play và trình cung cấp vị trí kết hợp cung cấp, hãy kết nối ứng dụng của bạn bằng Ứng dụng cài đặt, sau đó kiểm tra chế độ cài đặt vị trí hiện tại và nhắc người dùng bật các chế độ cài đặt yêu cầu (nếu cần).

Những ứng dụng có tính năng sử dụng dịch vụ vị trí phải yêu cầu quyền truy cập thông tin vị trí, tuỳ vào trường hợp sử dụng của các tính năng đó.

Thiết lập yêu cầu về thông tin vị trí

Để lưu trữ tham số cho các yêu cầu gửi đến trình cung cấp vị trí kết hợp, hãy tạo một LocationRequest. Tham số xác định mức độ chính xác cho các yêu cầu về thông tin vị trí. Để biết thông tin chi tiết về mọi tuỳ chọn hiện có cho yêu cầu thông tin vị trí, hãy xem tài liệu tham khảo về lớp LocationRequest. Bài học này sẽ đặt khoảng thời gian giữa những lần cập nhật, khoảng thời gian nhanh nhất giữa những lần cập nhật và mức độ ưu tiên như mô tả dưới đây:

Khoảng thời gian giữa những lần cập nhật
setInterval() – Phương thức này sẽ đặt tốc độ (tính theo mili giây) ứng dụng của bạn muốn nhận thông tin cập nhật vị trí. Xin lưu ý rằng thông tin cập nhật vị trí có thể nhanh hoặc chậm hơn một chút so với tốc độ này để tối ưu hoá mức sử dụng pin, hoặc ứng dụng có thể không cập nhật (chẳng hạn như khi thiết bị không có kết nối).
Khoảng thời gian nhanh nhất giữa những lần cập nhật
setFastestInterval() – Phương thức này sẽ đặt tốc độ nhanh nhất (tính theo mili giây) mà ứng dụng của bạn có thể xử lý thông tin cập nhật vị trí. Bạn không cần gọi phương thức này trừ phi ứng dụng được hưởng lợi khi nhận thông tin cập nhật nhanh hơn so với tốc độ đã chỉ định trong setInterval().
Mức độ ưu tiên

setPriority() – Phương thức này sẽ đặt mức độ ưu tiên của yêu cầu, qua đó dịch vụ vị trí của Dịch vụ Google Play có thể biết rõ nguồn vị trí sẽ sử dụng. Các giá trị sau được hỗ trợ:

  • PRIORITY_BALANCED_POWER_ACCURACY – Sử dụng chế độ cài đặt này để yêu cầu độ chính xác của vị trí phải nằm trong phạm vi một khu phố, tức là độ chính xác khoảng 100 mét. Đây được coi là mức độ chính xác tương đối và có khả năng sẽ tốn ít pin hơn. Với chế độ cài đặt này, dịch vụ vị trí nhiều khả năng sẽ sử dụng vị trí của Wi-Fi và trạm phát sóng. Tuy nhiên, hãy lưu ý rằng việc lựa chọn nguồn cung cấp vị trí phụ thuộc vào nhiều yếu tố khác, chẳng hạn như các nguồn hiện có.
  • PRIORITY_HIGH_ACCURACY – Sử dụng chế độ cài đặt này để yêu cầu thông tin vị trí chính xác nhất có thể. Với chế độ cài đặt này, dịch vụ vị trí nhiều khả năng sẽ sử dụng GPS để xác định vị trí.
  • PRIORITY_LOW_POWER – Sử dụng chế độ cài đặt này để yêu cầu độ chính xác ở cấp thành phố, tức là độ chính xác khoảng 10 km. Đây được coi là mức độ chính xác tương đối và có khả năng sẽ tốn ít pin hơn.
  • PRIORITY_NO_POWER – Sử dụng chế độ cài đặt này nếu bạn cần mức tác động không đáng kể đến lượng pin tiêu thụ, nhưng muốn nhận thông tin cập nhật vị trí khi có sẵn. Với chế độ cài đặt này, ứng dụng của bạn không kích hoạt yêu cầu thông tin cập nhật vị trí, nhưng sẽ nhận thông tin vị trí do các ứng dụng khác kích hoạt.

Hãy tạo yêu cầu thông tin vị trí và đặt tham số như minh hoạ trong đoạn mã mẫu sau:

Kotlin

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

Java

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

Mức độ ưu tiên PRIORITY_HIGH_ACCURACY, kết hợp với chế độ cài đặt quyền ACCESS_FINE_LOCATION mà bạn đã xác định trong tệp kê khai ứng dụng, cùng khoảng thời gian giữa những lần cập nhật nhanh là 5000 mili giây (5 giây) khiến trình cung cấp vị trí kết hợp trả về thông tin cập nhật vị trí chính xác trong phạm vi vài feet. Phương pháp này thích hợp để liên kết các ứng dụng hiển thị thông tin vị trí theo thời gian thực.

Gợi ý về hiệu suất: Nếu ứng dụng của bạn truy cập mạng hoặc thực hiện tác vụ lâu dài khác sau khi nhận thông tin cập nhật vị trí, hãy điều chỉnh khoảng thời gian nhanh nhất giữa các lần cập nhật thành một giá trị chậm hơn. Sự điều chỉnh này giúp ứng dụng không phải nhận thông tin cập nhật mà ứng dụng không dùng được. Sau khi hoàn tất tác vụ lâu dài, hãy đặt lại khoảng thời gian nhanh nhất giữa các lần cập nhật thành giá trị nhanh.

Xem chế độ cài đặt vị trí hiện tại

Sau khi kết nối với Dịch vụ Google Play và API dịch vụ vị trí, bạn có thể xem chế độ cài đặt vị trí hiện tại trên thiết bị của người dùng. Để thực hiện việc này, hãy tạo một LocationSettingsRequest.Builder và thêm một hoặc nhiều yêu cầu về thông tin vị trí. Đoạn mã sau đây cho biết cách thêm yêu cầu về thông tin vị trí đã được tạo ở bước trước:

Kotlin

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

Java

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

Tiếp theo, hãy kiểm tra xem chế độ cài đặt vị trí hiện tại có thoả mãn hay không:

Kotlin

val builder = LocationSettingsRequest.Builder()

// ...

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

Java

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

// ...

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

Khi Task hoàn tất, ứng dụng của bạn có thể kiểm tra chế độ cài đặt vị trí bằng cách xem xét mã trạng thái từ đối tượng LocationSettingsResponse. Để biết thông tin chi tiết hơn nữa về trạng thái hiện tại của các chế độ cài đặt vị trí có liên quan, ứng dụng của bạn có thể gọi phương thức getLocationSettingsStates() của đối tượng LocationSettingsResponse.

Nhắc người dùng thay đổi chế độ cài đặt vị trí

Để xác định xem chế độ cài đặt vị trí có phù hợp với yêu cầu về thông tin vị trí hay không, hãy thêm OnFailureListener vào đối tượng Task giúp xác thực chế độ cài đặt vị trí. Tiếp đến, hãy kiểm tra xem đối tượng Exception được truyền vào phương thức onFailure() có phải là một thực thể của lớp ResolvableApiException hay không. Lớp này cho biết rằng chế độ cài đặt phải được thay đổi. Sau đó, hãy hiển thị hộp thoại nhắc người dùng cấp quyền sửa đổi chế độ cài đặt vị trí bằng cách gọi startResolutionForResult().

Đoạn mã sau đây cho biết cách xác định xem chế độ cài đặt vị trí của người dùng có cho phép dịch vụ vị trí tạo LocationRequest hay không, cũng như cách yêu cầu người dùng cấp quyền thay đổi chế độ cài đặt vị trí nếu cần:

Kotlin

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.
        }
    }
}

Java

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

Bài học tiếp theo, Nhận thông tin cập nhật vị trí, sẽ cho bạn biết cách nhận thông tin cập nhật vị trí định kỳ.