Lấy thông tin vị trí đã biết gần đây nhất

Bằng cách sử dụng API vị trí trong Dịch vụ Google Play, ứng dụng của bạn có thể yêu cầu thông tin vị trí xác định gần đây nhất của thiết bị mà người dùng sử dụng. Trong hầu hết trường hợp, bạn muốn biết vị trí hiện tại của người dùng. Vị trí này thường tương đương với vị trí xác định gần đây nhất của thiết bị.

Cụ thể, hãy sử dụng trình cung cấp vị trí kết hợp để truy xuất thông tin vị trí xác định gần đây nhất của thiết bị. Trình cung cấp vị trí kết hợp là một trong những API vị trí trong Dịch vụ Google Play. Trình cung cấp này quản lý công nghệ định vị cơ bản và cung cấp một API đơn giản để bạn có thể chỉ định các yêu cầu ở cấp cao, chẳng hạn như độ chính xác cao hoặc mức điện năng thấp. Ngoài ra, trình cung cấp này cũng tối ưu hoá việc sử dụng nguồn pin của thiết bị.

Lưu ý: Khi ứng dụng của bạn chạy ở chế độ nền, quyền truy cập vào vị trí cần đóng vai trò quan trọng trong chức năng cốt lõi của ứng dụng và đi kèm thông tin công bố phù hợp cho người dùng.

Bài học này sẽ hướng dẫn bạn cách tạo một yêu cầu về thông tin vị trí của thiết bị bằng phương thức getLastLocation() trong trình cung cấp vị trí kết hợp.

Thiết lập Dịch vụ Google Play

Để truy cập vào trình cung cấp vị trí kết hợp, dự án phát triển của ứng dụng phải bao gồm Dịch vụ Google Play. Hãy tải xuống và cài đặt thành phần Dịch vụ Google Play thông qua Trình quản lý SDK rồi thêm thư viện vào dự án của bạn. Để biết thông tin chi tiết, hãy xem hướng dẫn về cách Thiết lập Dịch vụ Google Play.

Chỉ định các quyền cho ứng dụng

Những ứng dụng có cá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ỳ thuộc vào trường hợp sử dụng của các tính năng đó.

Tạo ứng dụng dịch vụ vị trí

Trong phương thức onCreate() của hoạt động, hãy tạo một thực thể của ứng dụng Trình cung cấp vị trí kết hợp như minh hoạ trong đoạn mã sau đây.

Kotlin

private lateinit var fusedLocationClient: FusedLocationProviderClient

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}

Java

private FusedLocationProviderClient fusedLocationClient;

// ..

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
}

Lấy thông tin vị trí xác định gần đây nhất

Sau khi tạo ứng dụng Dịch vụ vị trí, bạn có thể lấy thông tin vị trí xác định gần đây nhất của thiết bị mà người dùng sử dụng. Khi ứng dụng của bạn được kết nối với dịch vụ vị trí, bạn có thể dùng phương thức getLastLocation() của trình cung cấp vị trí kết hợp để truy xuất thông tin vị trí của thiết bị. Độ chính xác của vị trí do lệnh gọi này trả về được xác định theo chế độ cài đặt quyền mà bạn đưa vào tệp kê khai ứng dụng, như mô tả trong hướng dẫn về cách yêu cầu quyền truy cập thông tin vị trí.

Để yêu cầu thông tin vị trí xác định gần đây nhất, hãy gọi phương thức getLastLocation(). Đoạn mã sau đây minh hoạ yêu cầu này và một cách xử lý đơn giản cho nội dung phản hồi:

Kotlin

fusedLocationClient.lastLocation
        .addOnSuccessListener { location : Location? ->
            // Got last known location. In some rare situations this can be null.
        }

Java

fusedLocationClient.getLastLocation()
        .addOnSuccessListener(this, new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                // Got last known location. In some rare situations this can be null.
                if (location != null) {
                    // Logic to handle location object
                }
            }
        });

Phương thức getLastLocation() trả về Task mà bạn có thể dùng để lấy đối tượng Location kèm theo toạ độ (vĩ độ và kinh độ) của một vị trí địa lý. Đối tượng vị trí có thể có giá trị null trong các trường hợp sau:

  • Dịch vụ vị trí bị tắt trong phần cài đặt thiết bị. Kết quả có thể có giá trị null ngay cả khi từng truy xuất thông tin vị trí gần đây nhất vì bộ nhớ đệm cũng sẽ bị xoá khi tắt dịch vụ vị trí.
  • Thiết bị chưa từng ghi lại vị trí của thiết bị. Trường hợp này có thể xảy ra với thiết bị mới hoặc thiết bị đã được khôi phục về trạng thái cài đặt ban đầu.
  • Dịch vụ Google Play trên thiết bị đã khởi động lại và không có ứng dụng Trình cung cấp vị trí kết hợp nào đang hoạt động yêu cầu thông tin vị trí sau khi dịch vụ đó khởi động lại. Để tránh trường hợp này, bạn có thể tạo một ứng dụng mới và tự mình yêu cầu thông báo cập nhật vị trí. Để biết thêm thông tin, hãy xem bài học Nhận thông báo cập nhật vị trí.

Chọn thông tin vị trí ước tính chính xác nhất

FusedLocationProviderClient cung cấp một số phương thức để truy xuất thông tin vị trí của thiết bị. Hãy chọn một trong những phương thức sau, tuỳ thuộc vào trường hợp sử dụng của ứng dụng:

  • getLastLocation() lấy thông tin vị trí ước tính nhanh hơn và giảm thiểu mức sử dụng pin có thể được phân bổ cho ứng dụng của bạn. Tuy nhiên, thông tin vị trí có thể bị lỗi thời nếu gần đây không có ứng dụng nào khác sử dụng vị trí.
  • getCurrentLocation() lấy thông tin vị trí mới và chính xác hơn theo cách nhất quán hơn. Tuy nhiên, phương thức này có thể kích hoạt quá trình tính toán vị trí trên thiết bị

    Bạn nên dùng cách này để lấy thông tin vị trí mới mỗi khi có thể. Cách này an toàn hơn so với những giải pháp thay thế như tự mình bắt đầu và quản lý thông báo cập nhật vị trí bằng requestLocationUpdates(). Nếu ứng dụng của bạn gọi requestLocationUpdates(), thì đôi khi ứng dụng có thể tiêu thụ nhiều điện năng nếu không có thông tin vị trí hoặc nếu yêu cầu không được dừng đúng cách sau khi lấy thông tin vị trí mới.

Tài nguyên khác

Để biết thêm thông tin về cách tìm nạp thông tin vị trí hiện tại trong Android, hãy xem các tài liệu sau:

Mẫu

  • Ứng dụng mẫu để minh hoạ các phương pháp hay nhất khi tìm nạp thông tin vị trí hiện tại.