Địa điểm hiện tại

Nhà phát triển ở Khu vực kinh tế Châu Âu (EEA)

Khi 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 bao gồm các doanh nghiệp tại địa phương, đ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 sẽ 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_LOCATIONACCESS_COARSE_LOCATION do thư viện 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ề 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:

  1. Gọi ContextCompat.checkSelfPermission để kiểm tra xem người dùng đã cấp quyền truy cập 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ả. Hãy xem phần Yêu cầu cấp quyền cho ứng dụng để biết thông tin chi tiết.
  2. Tạo một FindCurrentPlaceRequest, truyền một List của Place.Field, chỉ định các loại dữ liệu vị trí mà ứng dụng của bạn sẽ yêu cầu.
  3. Gọi PlacesClient.findCurrentPlace(), truyền FindCurrentPlaceRequest mà bạn đã tạo ở bước trước.
  4. 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í: Thông tin cơ bản, Thông tin liên hệ và Không gian. Các trường cơ bản được tính theo mức giá cơ bản và không tính thêm phí. Các trường Liên hệ 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í các yêu cầu dữ liệu về Địa điểm, hãy xem phần Mức sử dụng và tính phí.

API 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ó thể là vị trí của thiết bị. Đối với mỗi địa điểm, kết quả sẽ cho biết xác suất đị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 được xác định 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 PlacePlaceLikelihood.getLikelihood() để nhận điểm xếp hạng về khả năng là đị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ã mẫu sau đây truy xuất danh sách những địa điểm mà thiết bị có nhiều khả năng nằm ở đó nhất, đồng thời ghi lại tên và xác suất cho 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ị xác suất:

  • Mức độ phù hợp 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 địa điểm được trả về cho một yêu cầu. Bạn không thể so sánh xác suất giữa các yêu cầu.
  • Giá trị của xác suất sẽ nằm trong khoảng từ 0 đến 1.

Ví dụ: để thể hiện xác suất 55% là địa điểm chính xác là Địa điểm A và xác suất 35% là Địa điểm B, phản hồi sẽ có hai thành phầ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 phân bổ trong ứng dụng

Khi ứng dụng của bạn hiển thị thông tin thu được từ PlacesClient.findCurrentPlace(), ứng dụng đó cũng phải hiển thị thông tin phân bổ. Xem tài liệu về thuộc tính.