Bằng cách sử dụng SDK địa điểm dành cho Android, bạn có thể khám phá địa điểm tại vị trí hiện được báo cáo của thiết bị. Ví dụ về địa điểm: doanh nghiệp địa phương, địa điểm yêu thích và vị trí địa lý.
Quyền
Để sử dụng thư viện, bạn không cần khai báo thêm quyền nào trong tệp kê khai của ứng dụng, vì thư viện sẽ khai báo tất cả các quyền mà thư viện dùng trong tệp kê khai. Tuy nhiên, nếu ứng dụng của bạn dùng PlacesClient.findCurrentPlace()
, thì bạn phải yêu cầu quyền truy cập thông tin vị trí trong thời gian chạy.
Nếu ứng dụng của bạn không dùng PlacesClient.findCurrentPlace()
, hãy xoá rõ ràng các quyền ACCESS_FINE_LOCATION
và ACCESS_COARSE_LOCATION
mà thư viện giới thiệu bằng cách thêm nội dung sau đây vào tệp kê khai:
<manifest ... xmlns:tools="http://schemas.android.com/tools"> ... <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="remove"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="remove"/> ... </manifest>
Hãy đọc thêm về quyền và cân nhắc sử dụng EasyPermissions để bắt đầu.
Lấy thông tin vị trí hiện tại
Để tìm doanh nghiệp địa phương hoặc địa điểm khác mà bạn đang đặt thiết bị, hãy làm theo các bước sau:
- Gọi
ContextCompat.checkSelfPermission
để kiểm tra xem người dùng đã cấp quyền truy cập vào thông tin vị trí của thiết bị hay chưa. Ứng dụng của bạn cũng phải bao gồm mã để nhắc người dùng cấp quyền và xử lý kết quả. Xem phần Yêu cầu quyền cho ứng dụng để biết thông tin chi tiết. - Tạo một
FindCurrentPlaceRequest
, truyềnList
củaPlace.Field
, chỉ định kiểu dữ liệu địa điểm mà ứng dụng của bạn yêu cầu. - Gọi
PlacesClient.findCurrentPlace()
, truyềnFindCurrentPlaceRequest
mà bạn đã tạo ở bước trước. - Lấy danh sách các
PlaceLikelihood
từFindCurrentPlaceResponse
.
Các trường tương ứng với kết quả Tìm kiếm địa điểm và được chia thành ba danh mục thanh toán: Cơ bản, Liên hệ và Bầu không khí. Các trường cơ bản được tính phí theo giá cơ bản và không phát sinh thêm phí. Các trường Địa chỉ liên hệ và Bầu không khí có mức phí cao hơn. Để biết thêm thông tin về cách tính phí cho các yêu cầu Dữ liệu địa điểm, hãy xem bài viết Mức sử dụng và thanh toán.
API này trả về một FindCurrentPlaceResponse
trong Task
.
FindCurrentPlaceResponse
chứa danh sách các đối tượng PlaceLikelihood
đại diện cho những nơi có khả năng đang đặt thiết bị. Đối với mỗi địa điểm, kết quả bao gồm chỉ báo về khả năng địa điểm đó là phù hợp. Danh sách này có thể trống, nếu không có địa điểm đã biết nào tương ứng với vị trí thiết bị đã cho.
Bạn có thể gọi PlaceLikelihood.getPlace()
để truy xuất đối tượng Place
và PlaceLikelihood.getLikelihood()
để nhận xếp hạng khả năng xảy ra của địa điểm. Giá trị càng cao thì xác suất địa điểm phù hợp nhất càng lớn.
Mã mẫu sau đây truy xuất danh sách các địa điểm mà thiết bị có nhiều khả năng đang ở nhất rồi ghi lại tên và khả năng xuất hiện của từng địa điểm.
Kotlin
// Use fields to define the data types to return. val placeFields: List<Place.Field> = listOf(Place.Field.NAME) // Use the builder to create a FindCurrentPlaceRequest. val request: FindCurrentPlaceRequest = FindCurrentPlaceRequest.newInstance(placeFields) // Call findCurrentPlace and handle the response (first check that the user has granted permission). if (ContextCompat.checkSelfPermission(this, permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { val placeResponse = placesClient.findCurrentPlace(request) placeResponse.addOnCompleteListener { task -> if (task.isSuccessful) { val response = task.result for (placeLikelihood: PlaceLikelihood in response?.placeLikelihoods ?: emptyList()) { Log.i( TAG, "Place '${placeLikelihood.place.name}' has likelihood: ${placeLikelihood.likelihood}" ) } } else { val exception = task.exception if (exception is ApiException) { Log.e(TAG, "Place not found: ${exception.statusCode}") } } } } else { // A local method to request required permissions; // See https://developer.android.com/training/permissions/requesting getLocationPermission() }
Java
// Use fields to define the data types to return. List<Place.Field> placeFields = Collections.singletonList(Place.Field.NAME); // Use the builder to create a FindCurrentPlaceRequest. FindCurrentPlaceRequest request = FindCurrentPlaceRequest.newInstance(placeFields); // Call findCurrentPlace and handle the response (first check that the user has granted permission). if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { Task<FindCurrentPlaceResponse> placeResponse = placesClient.findCurrentPlace(request); placeResponse.addOnCompleteListener(task -> { if (task.isSuccessful()){ FindCurrentPlaceResponse response = task.getResult(); for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) { Log.i(TAG, String.format("Place '%s' has likelihood: %f", placeLikelihood.getPlace().getName(), placeLikelihood.getLikelihood())); } } else { Exception exception = task.getException(); if (exception instanceof ApiException) { ApiException apiException = (ApiException) exception; Log.e(TAG, "Place not found: " + apiException.getStatusCode()); } } }); } else { // A local method to request required permissions; // See https://developer.android.com/training/permissions/requesting getLocationPermission(); }
Lưu ý về các giá trị khả năng:
- Khả năng này cung cấp xác suất tương đối của địa điểm phù hợp nhất trong danh sách các vị trí được trả về cho một yêu cầu duy nhất. Bạn không thể so sánh khả năng xảy ra giữa các yêu cầu khác nhau.
- Giá trị xác suất sẽ nằm trong khoảng từ 0.0 đến 1.0.
Ví dụ: để thể hiện 55% khả năng địa điểm chính là Địa điểm A và 35% khả năng địa điểm đó là Địa điểm B, phản hồi có hai thành phần, Địa điểm A có khả năng là 0, 55 và Địa điểm B có khả năng là 0,35.
Hiển thị thuộc tính trong ứng dụng của bạn
Khi hiển thị thông tin thu được từ PlacesClient.findCurrentPlace()
, ứng dụng của bạn cũng phải cho thấy các thuộc tính. Xem tài liệu về mô hình phân bổ.