Khi dùng Places SDK for 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 bao gồ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 này, bạn không cần khai báo thêm bất kỳ quyền nào trong tệp kê khai của ứng dụng, vì thư viện này khai báo tất cả các quyền mà thư viện sử dụng trong tệp kê khai của chính nó. Tuy nhiên, nếu ứng dụng của bạn sử dụng PlacesClient.findCurrentPlace()
, bạn phải yêu cầu quyền truy cập thông tin vị trí khi bắt đầu chạy.
Nếu ứng dụng của bạn không sử dụng PlacesClient.findCurrentPlace()
, hãy xoá rõ ràng các quyền ACCESS_FINE_LOCATION
và ACCESS_COARSE_LOCATION
do thư viện này giới thiệu bằng cách thêm nội dung sau 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>
Đọc thêm về các quyền và cân nhắc sử dụng EasyPermissions để bắt đầu.
Lấy vị trí hiện tại
Để tìm doanh nghiệp địa phương hoặc địa điểm khác nơi thiết bị hiện đang ở, 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í trên thiết bị của họ hay chưa. Ứng dụng của bạn cũng phải có mã để nhắc người dùng cấp quyền và xử lý kết quả. Hãy 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ền mộtList
gồm cácPlace.Field
, chỉ định các loại dữ liệu về địa điểm mà ứng dụng của bạn nê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
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 3 danh mục tính phí: Cơ bản, Thông tin liên hệ và Bầu không khí. Các trường cơ bản được tính theo mức giá cơ bản và không phát sinh thêm phí. Các trường Contact (Người liên hệ) và Atmosphere (Môi trường) được tính phí ở mức cao hơn. Để biết thêm thông tin về cách tính phí cho các yêu cầu về dữ liệu Địa điểm, hãy xem phần Mức sử dụng và việc 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 mà thiết bị có khả năng được đặt. Đối với mỗi địa điểm, kết quả sẽ cho biết khả năng địa điểm đó là địa điểm phù hợp. Danh sách này có thể trống nếu không có địa điểm 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 chỉ số về khả năng xuất hiện của địa điểm. Giá trị càng cao thì khả năng địa điểm đó là kết quả phù hợp nhất càng lớn.
Mẫu mã sau đây truy xuất danh sách những nơi mà thiết bị có khả năng được đặt nhất, đồng thời ghi nhật ký tên và khả năng cho mỗi nơi.
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:
- Xác suất cung cấp một xác suất tương đối về việc địa điểm đó là kết quả phù hợp nhất trong danh sách các địa điểm đượ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ị của khả năng sẽ nằm trong khoảng từ 0,0 đến 1,0.
Ví dụ: để biểu thị khả năng 55% rằng địa điểm chính xác là Địa điểm A và khả năng 35% rằng đó là Địa điểm B, phản hồi có 2 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ị thông tin ghi nhận quyền tác giả trong ứng dụng
Khi hiển thị thông tin thu được từ PlacesClient.findCurrentPlace()
, ứng dụng cũng phải hiển thị thông tin ghi nhận quyền tác giả. Xem tài liệu về quyền ghi công.