Đị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 ở 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 đị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 bất kỳ quyền nào khác trong tệp kê khai của ứng dụng, vì thư viện này khai báo mọi 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 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 sử dụng PlacesClient.findCurrentPlace(), hãy xoá một cách rõ ràng các quyền ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION mà 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ề các 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 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í thiết bị của họ hay chưa. Ứng dụng của bạn cũng phải chứa 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 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 nê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ả 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 phát sinh thêm phí. Các trường Thông tin liên hệ và Bầu không khí được thanh toán ở mức 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 Địa điểm, hãy xem bài viết Mức sử dụng và thanh toán.

API sẽ 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 địa điểm có thể đang đặt thiết bị. Đối với mỗi địa điểm, kết quả sẽ bao gồm một 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 nào xác định 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 khả năng xuất hiện của địa điểm đó. Giá trị càng cao thì xác suất địa điểm là phù hợp nhất càng cao.

Mã mẫu sau đây truy xuất danh sách các địa điểm có nhiều khả năng đặt thiết bị nhất, đồng thờ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 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 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 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ị 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, câu trả lời sẽ có hai thành phần, Địa điểm A với khả năng là 0, 55 và Địa điểm B với khả năng là 0,35.

Hiển thị thuộc tính trong ứng dụng của bạn

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 cho thấy các thuộc tính. Xem tài liệu về phân bổ.