Bằng cách sử dụng SDK Địa điểm 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 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, 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 khai báo tất cả quyền mà thư viện sử dụng trong tệp kê khai. 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í trong thời gian 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 đưa ra bằng cách thêm đoạn mã 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ề 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 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 vị trí thiết bị của họ 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ả. 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
FindCurrentPlaceRequest, truyềnListcủaPlace.Field, chỉ định loại dữ liệu địa điểm mà ứng dụng của bạn nên yêu cầu. - Gọi
PlacesClient.findCurrentPlace(), truyềnFindCurrentPlaceRequestmà bạn đã tạo ở bước trước. - Lấy danh sách
PlaceLikelihoodtừ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, Thông tin liên hệ và Bầu không khí. Các trường cơ bản được tính phí theo mức giá cơ bản và không phát sinh thêm phí. Các trường Tiếp xúc và Bầu không khí đượ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 dữ liệu Địa điểm, hãy xem phần Mức sử dụng và thanh toán.
API này trả về một
FindCurrentPlaceResponse
trong một
Task.
FindCurrentPlaceResponse chứa danh sách các đối tượng PlaceLikelihood đại diện cho những địa điểm mà thiết bị có thể đang ở đó. Đố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 có thể trống nếu không có địa điểm nào đã biết 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 điểm 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 đó là kết quả 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, đồng thời ghi lại tên và khả năng xảy ra cho từng địa điểm.
Kotlin
// Use fields to define the data types to return. val placeFields = listOf(Place.Field.DISPLAY_NAME, Place.Field.FORMATTED_ADDRESS, Place.Field.LOCATION) // Define the search area around the current location (500m radius). val currentLocation = LatLng(37.4220, -122.0841) val circle = CircularBounds.newInstance(currentLocation, 500.0) val request = SearchNearbyRequest.builder(circle, placeFields) .setMaxResultCount(20) .build() // Call searchNearby and handle the response (first check that the user has granted permission). if (ContextCompat.checkSelfPermission(this, permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED ) { placesClient.searchNearby(request).addOnSuccessListener { response -> binding.progressBar.visibility = View.GONE adapter.setPlaces(response.places) }.addOnFailureListener { exception -> binding.progressBar.visibility = View.GONE 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 = Arrays.asList( Place.Field.DISPLAY_NAME, Place.Field.FORMATTED_ADDRESS, Place.Field.LOCATION); // Define the search area around the current location. LatLng currentLocation = new LatLng(37.4220, -122.0841); LocationRestriction circle = CircularBounds.newInstance(currentLocation, /* radius= */ 500.0); // Use the builder to create a SearchNearbyRequest. SearchNearbyRequest request = SearchNearbyRequest.builder(circle, placeFields).setMaxResultCount(20).build(); // Call searchNearby and handle the response (first check that the user has granted // permission). if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { Task<SearchNearbyResponse> placeResponse = placesClient.searchNearby(request); placeResponse.addOnCompleteListener( task -> { binding.progressBar.setVisibility(View.GONE); if (task.isSuccessful()) { SearchNearbyResponse response = task.getResult(); adapter.setPlaces(response.getPlaces()); } else { Exception exception = task.getException(); if (exception instanceof ApiException apiException) { Log.e( "CurrentPlace", "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 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. 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 xảy ra sẽ nằm trong khoảng từ 0 đến 1.
Ví dụ: để thể hiện xác suất 55% rằng địa điểm chính xác là Địa điểm A và xác suất 35% rằng đó là Địa điểm B, phản hồi sẽ có hai thành viên, Địa điểm A có xác suất là 0, 55 và Địa điểm B có xác suất là 0,35.
Hiển thị thông tin ghi nhận tác giả trong ứng dụng
Khi ứng dụng của bạn hiển thị thông tin lấy từ PlacesClient.findCurrentPlace(), ứng dụng cũng phải hiển thị thông tin ghi nhận tác giả. Hãy xem tài liệu về thông tin ghi nhận tác giả.