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

Chọn nền tảng: Android iOS

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ề các đị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 này khai báo tất cả các quyền mà ứng dụng 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 xóa rõ ràng các quyền ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION mà thư viện đưa ra 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>

Hãy đọc thêm về các quyền và cân nhắc sử dụng quyền dễ dàng để 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 hiện đang đặt thiết bị, 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 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ả. Hãy xem bài viết Yêu cầu quyền cho ứng dụng để biết thông tin chi tiết.
  2. Tạo một FindCurrentPlaceRequest, truyền List của Place.Field, chỉ định loại dữ liệu địa điểm mà ứng dụng của bạn 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ả trên 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 mức cơ bản và không tính thêm phí. Địa chỉ liên hệ và trường Khí quyển được tính phí 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à thanh toán.

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ể đặt thiết bị của bạn. Đối với mỗi địa điểm, kết quả sẽ bao gồm chỉ báo về khả năng là địa điểm đó là chính xác. Danh sách này có thể trống nếu không có địa điểm đã biết tương ứng với vị trí thiết bị nhất định.

Bạn có thể gọi PlaceLikelihood.getPlace() để truy xuất đối tượng PlacePlaceLikelihood.getLikelihood() để nhận điểm xếp hạng theo khả năng của địa điểm. Giá trị cao hơn có nghĩa là khả năng cao nhất về địa điểm là phù hợp nhất.

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 xuất hiện nhất, đồng thời ghi nhật ký tên và khả năng cho từng địa điểm.

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();
}

      

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()
}

      

Lưu ý về các giá trị có khả năng xảy ra:

  • Khả năng cung cấp xác suất tương đối của địa điểm là 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 khả năng giữa các yêu cầu.
  • Giá trị của khả năng sẽ nằm trong khoảng từ 0 đến 1.0.

Ví dụ: để thể hiện 55% khả năng là địa điểm chính xác là Địa điểm A và 35% khả năng là địa điểm B, địa điểm phản hồi 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ị mô hình phân bổ trong ứng dụng của bạn

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ị các thông tin ghi nhận sự đóng góp. Hãy xem tài liệu về mô hình phân bổ.