Dịch vụ tự động hoàn thành trong SDK Địa điểm dành cho Android sẽ trả về các gợi ý diễn ra để phản hồi cụm từ tìm kiếm của người dùng. Khi người dùng nhập, dịch vụ tự động hoàn tất sẽ trả về các đề xuất cho các địa điểm như doanh nghiệp, địa chỉ, mã cộng và địa điểm yêu thích.
Bạn có thể thêm tính năng tự động hoàn thành vào ứng dụng của mình theo các cách sau:
- Thêm tiện ích tự động hoàn thành để tiết kiệm thời gian phát triển và đảm bảo trải nghiệm nhất quán cho người dùng.
- Nhận thông tin dự đoán địa điểm theo phương thức lập trình để tạo trải nghiệm người dùng tuỳ chỉnh.
Thêm tiện ích tự động hoàn thành
Tiện ích tự động hoàn thành là một hộp thoại tìm kiếm có chức năng tự động hoàn thành tích hợp sẵn. Khi người dùng nhập cụm từ tìm kiếm, tiện ích này sẽ hiển thị danh sách các địa điểm dự đoán để lựa chọn. Khi người dùng lựa chọn, thực thể Place
sẽ được trả về. Ứng dụng của bạn có thể sử dụng thực thể này để lấy thông tin chi tiết về địa điểm đã chọn.
Có hai lựa chọn để thêm tiện ích tự động hoàn thành vào ứng dụng của bạn:
- Cách 1: Nhúng
AutocompleteSupportFragment
. - Cách 2: Sử dụng ý định để chạy hoạt động tự động hoàn thành.
Lựa chọn 1: Nhúng AutofillSupportFragment
Để thêm AutocompleteSupportFragment
vào ứng dụng, hãy làm theo các bước sau:
- Thêm một mảnh vào bố cục XML của hoạt động.
- Thêm trình nghe vào hoạt động hoặc mảnh của bạn.
Thêm AutofillSupportFragment vào một hoạt động
Để thêm AutocompleteSupportFragment
vào một hoạt động, hãy thêm một mảnh mới vào bố cục XML. Ví dụ:
<fragment android:id="@+id/autocomplete_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment"
/>
- Theo mặc định, mảnh không có đường viền hoặc nền. Để mang lại giao diện hình ảnh nhất quán, hãy lồng mảnh trong một phần tử bố cục khác, chẳng hạn như CardView.
- Nếu đang sử dụng mảnh Tự động hoàn thành và cần ghi đè
onActivityResult
, bạn phải gọisuper.onActivityResult
, nếu không, mảnh sẽ không hoạt động đúng cách.
Thêm PlaceSelectionListener vào một hoạt động
PlaceSelectionListener
xử lý việc trả về một địa điểm theo lựa chọn của người dùng. Mã sau đây cho thấy cách tạo tham chiếu đến mảnh và thêm trình nghe vào AutocompleteSupportFragment
:
Java
// Initialize the AutocompleteSupportFragment. AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment) getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment); // Specify the types of place data to return. autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME)); // Set up a PlaceSelectionListener to handle the response. autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() { @Override public void onPlaceSelected(@NonNull Place place) { // TODO: Get info about the selected place. Log.i(TAG, "Place: " + place.getName() + ", " + place.getId()); } @Override public void onError(@NonNull Status status) { // TODO: Handle the error. Log.i(TAG, "An error occurred: " + status); } });
Kotlin
// Initialize the AutocompleteSupportFragment. val autocompleteFragment = supportFragmentManager.findFragmentById(R.id.autocomplete_fragment) as AutocompleteSupportFragment // Specify the types of place data to return. autocompleteFragment.setPlaceFields(listOf(Place.Field.ID, Place.Field.NAME)) // Set up a PlaceSelectionListener to handle the response. autocompleteFragment.setOnPlaceSelectedListener(object : PlaceSelectionListener { override fun onPlaceSelected(place: Place) { // TODO: Get info about the selected place. Log.i(TAG, "Place: ${place.name}, ${place.id}") } override fun onError(status: Status) { // TODO: Handle the error. Log.i(TAG, "An error occurred: $status") } })
Lựa chọn 2: Sử dụng một ý định để chạy hoạt động tự động hoàn thành
Nếu bạn muốn ứng dụng của mình sử dụng một quy trình điều hướng khác (ví dụ: để kích hoạt trải nghiệm tự động hoàn thành từ một biểu tượng thay vì trường tìm kiếm), ứng dụng của bạn có thể chạy tính năng tự động hoàn thành bằng cách sử dụng một ý định.
Để chạy tiện ích tự động hoàn thành bằng một ý định, hãy làm theo các bước sau:
- Sử dụng
Autocomplete.IntentBuilder
để tạo một ý định, truyền chế độAutocomplete
mong muốn. - Xác định trình chạy kết quả hoạt động
registerForActivityResult
có thể dùng để chạy ý định và xử lý gợi ý địa điểm đã chọn của người dùng trong kết quả.
Tạo ý định tự động hoàn thành
Ví dụ bên dưới sử dụng Autocomplete.IntentBuilder
để tạo ý định khởi chạy tiện ích tự động hoàn thành dưới dạng một ý định:
Java
// Set the fields to specify which types of place data to // return after the user has made a selection. List<Place.Field> fields = Arrays.asList(Place.Field.ID, Place.Field.NAME); // Start the autocomplete intent. Intent intent = new Autocomplete.IntentBuilder(AutocompleteActivityMode.FULLSCREEN, fields) .build(this); startAutocomplete.launch(intent);
Kotlin
// Set the fields to specify which types of place data to // return after the user has made a selection. val fields = listOf(Place.Field.ID, Place.Field.NAME) // Start the autocomplete intent. val intent = Autocomplete.IntentBuilder(AutocompleteActivityMode.FULLSCREEN, fields) .build(this) startAutocomplete.launch(intent)
Khi sử dụng ý định để khởi chạy tiện ích tự động hoàn thành, bạn có thể chọn trong số các chế độ hiển thị lớp phủ hoặc toàn màn hình. Các ảnh chụp màn hình sau đây cho thấy lần lượt từng chế độ hiển thị:


Đăng ký lệnh gọi lại cho kết quả của ý định
Để nhận thông báo khi người dùng đã chọn một địa điểm, hãy xác định trình chạy registerForActivityResult()
. Trình chạy này sẽ khởi chạy hoạt động và xử lý kết quả như trong ví dụ sau. Nếu người dùng đã chọn một cụm từ gợi ý, cụm từ gợi ý đó sẽ được phân phối trong ý định có trong đối tượng kết quả. Vì ý định do Autocomplete.IntentBuilder
tạo nên phương thức Autocomplete.getPlaceFromIntent()
có thể trích xuất đối tượng Địa điểm từ đó.
Java
private final ActivityResultLauncher<Intent> startAutocomplete = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { Intent intent = result.getData(); if (intent != null) { Place place = Autocomplete.getPlaceFromIntent(intent); Log.i(TAG, "Place: ${place.getName()}, ${place.getId()}"); } } else if (result.getResultCode() == Activity.RESULT_CANCELED) { // The user canceled the operation. Log.i(TAG, "User canceled autocomplete"); } });
Kotlin
private val startAutocomplete = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode == Activity.RESULT_OK) { val intent = result.data if (intent != null) { val place = Autocomplete.getPlaceFromIntent(intent) Log.i( TAG, "Place: ${place.name}, ${place.id}" ) } } else if (result.resultCode == Activity.RESULT_CANCELED) { // The user canceled the operation. Log.i(TAG, "User canceled autocomplete") } }
Nhận thông tin dự đoán địa điểm theo phương thức lập trình
Bạn có thể tạo giao diện người dùng tìm kiếm tuỳ chỉnh thay cho giao diện người dùng do tiện ích tự động hoàn tất cung cấp. Để làm việc này, ứng dụng của bạn phải nhận thông tin dự đoán địa điểm theo phương thức lập trình. Ứng dụng của bạn có thể nhận danh sách tên và/hoặc địa chỉ địa điểm dự đoán từ API tự động hoàn thành bằng cách gọi PlacesClient.findAutocompletePredictions()
, truyền đối tượng FindAutocompletePredictionsRequest
với các tham số sau:
- Bắt buộc: Chuỗi
query
chứa văn bản do người dùng nhập. - Nên dùng:
AutocompleteSessionToken
, giúp nhóm các giai đoạn truy vấn và lựa chọn trong hoạt động tìm kiếm của người dùng vào một phiên riêng biệt cho mục đích thanh toán. Phiên hoạt động bắt đầu khi người dùng bắt đầu nhập cụm từ tìm kiếm và kết thúc khi họ chọn một địa điểm. - Đề xuất: Đối tượng
RectangularBounds
chỉ định giới hạn vĩ độ và kinh độ để giới hạn kết quả ở khu vực đã chỉ định. - Không bắt buộc: Một hoặc nhiều mã quốc gia gồm 2 chữ cái (ISO 3166-1 Alpha-2), cho biết một hoặc nhiều quốc gia mà kết quả nên được giới hạn.
Không bắt buộc: Bạn có thể sử dụng
TypeFilter
để giới hạn kết quả về loại địa điểm đã chỉ định. Các loại địa điểm sau được hỗ trợ:TypeFilter.GEOCODE
– Chỉ trả về kết quả mã hoá địa lý, thay vì doanh nghiệp. Hãy sử dụng yêu cầu này để phân biệt các kết quả trong đó vị trí được chỉ định có thể không xác định.TypeFilter.ADDRESS
– Chỉ trả về kết quả tự động hoàn thành có địa chỉ chính xác. Sử dụng loại này khi bạn biết người dùng đang tìm kiếm một địa chỉ được chỉ định đầy đủ.TypeFilter.ESTABLISHMENT
– Chỉ trả về những địa điểm là doanh nghiệp.TypeFilter.REGIONS
– Chỉ trả về các địa điểm khớp với một trong các kiểu sau:LOCALITY
SUBLOCALITY
POSTAL_CODE
COUNTRY
ADMINISTRATIVE_AREA_LEVEL_1
ADMINISTRATIVE_AREA_LEVEL_2
TypeFilter.CITIES
– Chỉ trả về những kết quả khớp vớiLOCALITY
hoặcADMINISTRATIVE_AREA_LEVEL_3
.
Không bắt buộc:
LatLng
chỉ định vị trí xuất phát cho yêu cầu. Khi bạn gọisetOrigin()
, dịch vụ sẽ trả về khoảng cách tính bằng mét (distanceMeters
) từ điểm gốc được chỉ định, cho mỗi cụm từ gợi ý của tính năng tự động hoàn thành trong phản hồi.
Để biết thông tin về các loại địa điểm, hãy xem hướng dẫn về các loại địa điểm.
Ví dụ bên dưới cho thấy một lệnh gọi đầy đủ đến PlacesClient.findAutocompletePredictions()
.
Java
// Create a new token for the autocomplete session. Pass this to FindAutocompletePredictionsRequest, // and once again when the user makes a selection (for example when calling fetchPlace()). AutocompleteSessionToken token = AutocompleteSessionToken.newInstance(); // Create a RectangularBounds object. RectangularBounds bounds = RectangularBounds.newInstance( new LatLng(-33.880490, 151.184363), new LatLng(-33.858754, 151.229596)); // Use the builder to create a FindAutocompletePredictionsRequest. FindAutocompletePredictionsRequest request = FindAutocompletePredictionsRequest.builder() // Call either setLocationBias() OR setLocationRestriction(). .setLocationBias(bounds) //.setLocationRestriction(bounds) .setOrigin(new LatLng(-33.8749937, 151.2041382)) .setCountries("AU", "NZ") .setTypesFilter(Arrays.asList(PlaceTypes.ADDRESS)) .setSessionToken(token) .setQuery(query) .build(); placesClient.findAutocompletePredictions(request).addOnSuccessListener((response) -> { for (AutocompletePrediction prediction : response.getAutocompletePredictions()) { Log.i(TAG, prediction.getPlaceId()); Log.i(TAG, prediction.getPrimaryText(null).toString()); } }).addOnFailureListener((exception) -> { if (exception instanceof ApiException) { ApiException apiException = (ApiException) exception; Log.e(TAG, "Place not found: " + apiException.getStatusCode()); } });
Kotlin
// Create a new token for the autocomplete session. Pass this to FindAutocompletePredictionsRequest, // and once again when the user makes a selection (for example when calling fetchPlace()). val token = AutocompleteSessionToken.newInstance() // Create a RectangularBounds object. val bounds = RectangularBounds.newInstance( LatLng(-33.880490, 151.184363), LatLng(-33.858754, 151.229596) ) // Use the builder to create a FindAutocompletePredictionsRequest. val request = FindAutocompletePredictionsRequest.builder() // Call either setLocationBias() OR setLocationRestriction(). .setLocationBias(bounds) //.setLocationRestriction(bounds) .setOrigin(LatLng(-33.8749937, 151.2041382)) .setCountries("AU", "NZ") .setTypesFilter(listOf(PlaceTypes.ADDRESS)) .setSessionToken(token) .setQuery(query) .build() placesClient.findAutocompletePredictions(request) .addOnSuccessListener { response: FindAutocompletePredictionsResponse -> for (prediction in response.autocompletePredictions) { Log.i(TAG, prediction.placeId) Log.i(TAG, prediction.getPrimaryText(null).toString()) } }.addOnFailureListener { exception: Exception? -> if (exception is ApiException) { Log.e(TAG, "Place not found: ${exception.statusCode}") } }
API sẽ trả về một FindAutocompletePredictionsResponse
trong
Task
. FindAutocompletePredictionsResponse
chứa danh sách các đối tượng AutocompletePrediction
đại diện cho địa điểm được dự đoán. Danh sách này có thể trống nếu không có vị trí nào xác định tương ứng với cụm từ tìm kiếm và tiêu chí lọc.
Đối với mỗi địa điểm được dự đoán, bạn có thể gọi các phương thức sau để truy xuất thông tin chi tiết về địa điểm:
getFullText(CharacterStyle)
trả về văn bản đầy đủ của nội dung mô tả địa điểm. Đây là sự kết hợp giữa văn bản chính và văn bản phụ. Ví dụ: "Tháp Eiffel, Đại lộ Anatole France, Paris, Pháp". Ngoài ra, phương thức này cho phép bạn làm nổi bật các phần của nội dung mô tả khớp với nội dung tìm kiếm theo kiểu bạn chọn, bằng cách sử dụngCharacterStyle
. Tham sốCharacterStyle
là không bắt buộc. Đặt giá trị này thành rỗng nếu bạn không cần đánh dấu.getPrimaryText(CharacterStyle)
trả về văn bản chính mô tả một địa điểm. Đây thường là tên của địa điểm. Ví dụ: "Tháp Eiffel" và "123 Pitt Street".getSecondaryText(CharacterStyle)
trả về văn bản con của nội dung mô tả địa điểm. Điều này hữu ích, chẳng hạn như dưới dạng dòng thứ hai khi hiển thị các cụm từ gợi ý tự động hoàn thành. Ví dụ: "Đại lộ Anatole Pháp, Paris, Pháp" và "Sydney, New South Wales".getPlaceId()
trả về mã địa điểm của địa điểm được dự đoán. Mã địa điểm là giá trị nhận dạng dạng văn bản giúp nhận dạng duy nhất một địa điểm mà bạn có thể sử dụng để truy xuất lại đối tượngPlace
sau này. Để biết thêm thông tin về mã địa điểm trong SDK Địa điểm dành cho Android, hãy xem phần Chi tiết về địa điểm. Để biết thông tin chung về mã địa điểm, hãy xem phần Tổng quan về mã địa điểm.getPlaceTypes()
trả về danh sách các loại địa điểm liên kết với địa điểm này.getDistanceMeters()
trả về khoảng cách theo đường thẳng tính bằng mét giữa địa điểm này và điểm gốc được chỉ định trong yêu cầu.
Mã thông báo phiên hoạt động
Mã thông báo phiên sẽ nhóm các giai đoạn truy vấn và lựa chọn của lượt tìm kiếm tự động hoàn thành của người dùng thành một phiên riêng biệt cho mục đích thanh toán. Phiên hoạt động bắt đầu khi người dùng bắt đầu nhập cụm từ tìm kiếm và kết thúc khi họ chọn một địa điểm. Mỗi phiên có thể có nhiều truy vấn, theo sau là một lựa chọn địa điểm. Sau khi một phiên kết thúc, mã thông báo này sẽ không còn hợp lệ; ứng dụng của bạn phải tạo mã thông báo mới cho mỗi phiên. Bạn nên sử dụng mã thông báo phiên cho tất cả các phiên tự động hoàn tất có lập trình (khi bạn nhúng một mảnh hoặc chạy tính năng tự động hoàn thành bằng cách sử dụng một ý định, API sẽ tự động xử lý việc này).
SDK Địa điểm dành cho Android sử dụng AutocompleteSessionToken
để xác định từng phiên. Ứng dụng của bạn nên chuyển một mã thông báo phiên mới khi bắt đầu mỗi phiên mới, sau đó chuyển mã thông báo đó cùng với Mã địa điểm trong lệnh gọi tiếp theo đến fetchPlace()
để truy xuất Thông tin chi tiết về địa điểm cho địa điểm mà người dùng đã chọn.
Tìm hiểu thêm về mã thông báo phiên.
Giới hạn kết quả tự động hoàn thành
Bạn có thể ràng buộc kết quả tự động hoàn thành theo một khu vực địa lý cụ thể và/hoặc lọc kết quả theo một hoặc nhiều loại địa điểm, hoặc tối đa 5 quốc gia. Bạn có thể áp dụng các quy tắc ràng buộc này cho hoạt động tự động hoàn thành, AutocompleteSupportFragment
và các API tự động hoàn thành có lập trình.
Để ràng buộc kết quả, hãy làm như sau:
- Để ưu tiên các kết quả trong khu vực đã xác định, hãy gọi
setLocationBias()
(một số kết quả từ bên ngoài khu vực xác định vẫn có thể được trả về). - Để chỉ hiển thị các kết quả trong khu vực đã xác định, hãy gọi
setLocationRestriction()
(chỉ trả về các kết quả trong khu vực đã xác định). - Để chỉ trả về các kết quả phù hợp với một loại địa điểm cụ thể, hãy gọi
setTypesFilter()
(ví dụ: việc chỉ địnhTypeFilter.ADDRESS
sẽ chỉ trả về các kết quả có địa chỉ chính xác). - Để chỉ trả về kết quả trong tối đa 5 quốc gia đã chỉ định, hãy gọi
setCountries()
. Quốc gia phải được truyền dưới dạng mã quốc gia tương thích với hai ký tự, theo tiêu chuẩn ISO 3166-1 Alpha-2.
Xu hướng kết quả cho một khu vực cụ thể
Để xu hướng kết quả tự động hoàn thành theo một khu vực địa lý cụ thể, hãy gọi setLocationBias()
, truyền một RectangularBounds
.
Mã ví dụ sau đây cho thấy việc gọi setLocationBias()
trên một thực thể của mảnh để chuyển các đề xuất tự động hoàn thành đến khu vực Sydney, Úc.
Java
autocompleteFragment.setLocationBias(RectangularBounds.newInstance( new LatLng(-33.880490, 151.184363), new LatLng(-33.858754, 151.229596)));
Kotlin
autocompleteFragment.setLocationBias( RectangularBounds.newInstance( LatLng(-33.880490, 151.184363), LatLng(-33.858754, 151.229596) ) )
Giới hạn kết quả ở một khu vực cụ thể
Để hạn chế kết quả tự động hoàn thành ở một khu vực địa lý cụ thể, hãy gọi setLocationRestriction()
, truyền một RectangularBounds
.
Mã ví dụ sau đây cho thấy việc gọi setLocationRestriction()
trên một thực thể mảnh để chuyển các đề xuất tự động hoàn thành đến một khu vực Sydney, Úc.
Java
autocompleteFragment.setLocationRestriction(RectangularBounds.newInstance( new LatLng(-33.880490, 151.184363), new LatLng(-33.858754, 151.229596)));
Kotlin
autocompleteFragment.setLocationRestriction( RectangularBounds.newInstance( LatLng(-33.880490, 151.184363), LatLng(-33.858754, 151.229596) ) )
Lưu ý: Quy định hạn chế này chỉ áp dụng cho toàn bộ tuyến đường, hệ thống có thể trả về kết quả tổng hợp nằm bên ngoài giới hạn hình chữ nhật dựa trên một tuyến trùng lặp với hạn chế về vị trí.
Lọc kết quả theo loại địa điểm hoặc bộ sưu tập loại
Bạn có thể hạn chế kết quả trong yêu cầu tự động hoàn thành để những kết quả đó chỉ trả về một loại địa điểm nhất định. Chỉ định một bộ lọc bằng cách sử dụng loại địa điểm hoặc tập hợp loại được liệt kê trong Bảng 1, 2 và 3 trên Loại địa điểm. Nếu không có chỉ định nào được chỉ định, tất cả các loại sẽ được trả về.
Để lọc kết quả tự động hoàn thành, hãy gọi setTypesFilter()
để đặt bộ lọc.
Để chỉ định bộ lọc tập hợp kiểu hoặc kiểu:
Gọi
setTypesFilter()
và chỉ định tối đa 5 giá trị type trong Bảng 1 và Bảng 2 hiển thị trên Loại địa điểm. Giá trị loại được xác định bằng các hằng số trong PlaceTypes.Gọi
setTypesFilter()
và chỉ định một tập hợp loại từ Bảng 3 hiển thị trên Loại địa điểm. Các giá trị bộ sưu tập được xác định bằng các hằng số trong PlaceTypes.Chỉ được có một loại thuộc Bảng 3 trong yêu cầu. Nếu chỉ định giá trị từ Bảng 3, thì bạn không thể chỉ định giá trị từ Bảng 1 hoặc Bảng 2. Nếu bạn làm như vậy, thì sẽ xảy ra lỗi.
Mã ví dụ sau đây gọi setTypesFilter()
trên AutocompleteSupportFragment
và chỉ định nhiều giá trị loại.
Java
autocompleteFragment.setTypesFilter(Arrays.asList("landmark", "restaurant", "store"));
Kotlin
autocompleteFragment.setTypesFilter(listOf("landmark", "restaurant", "store"))
Mã ví dụ sau đây cho thấy việc gọi setTypesFilter()
trên AutocompleteSupportFragment
để thiết lập một bộ lọc chỉ trả về kết quả có địa chỉ chính xác bằng cách chỉ định tập hợp loại.
Java
autocompleteFragment.setTypesFilter(Arrays.asList(PlaceTypes.ADDRESS, PlaceTypes.ESTABLISHMENT));
Kotlin
autocompleteFragment.setTypesFilter(listOf(PlaceTypes.ADDRESS))
Ví dụ về mã sau đây cho thấy việc gọi setTypesFilter()
trên IntentBuilder
để thiết lập một bộ lọc chỉ trả về các kết quả có địa chỉ chính xác bằng cách chỉ định tập hợp loại.
Java
Intent intent = new Autocomplete.IntentBuilder( AutocompleteActivityMode.FULLSCREEN, fields) .setTypesFilter(Arrays.asList(PlaceTypes.ADDRESS)) .build(this);
Kotlin
val intent = Autocomplete.IntentBuilder(AutocompleteActivityMode.FULLSCREEN, fields) .setTypesFilter(listOf(PlaceTypes.ADDRESS)) .build(this)
Lọc kết quả theo quốc gia
Để lọc kết quả tự động hoàn thành theo tối đa 5 quốc gia, hãy gọi setCountries()
để đặt mã quốc gia.
Sau đó, chuyển bộ lọc vào một mảnh hoặc ý định. Quốc gia phải được truyền dưới dạng mã quốc gia tương thích với hai ký tự, theo tiêu chuẩn ISO 3166-1 Alpha-2.
Ví dụ về mã sau đây cho thấy việc gọi setCountries()
trên AutocompleteSupportFragment
để thiết lập một bộ lọc chỉ trả về kết quả trong các quốc gia đã chỉ định.
Java
autocompleteFragment.setCountries("AU", "NZ");
Kotlin
autocompleteFragment.setCountries("AU", "NZ")
Hạn mức sử dụng
Việc bạn sử dụng API Địa điểm, bao gồm cả SDK Địa điểm dành cho Android, không còn bị giới hạn ở số lượng yêu cầu tối đa mỗi ngày (QPD). Tuy nhiên, các hạn mức sử dụng sau đây vẫn được áp dụng:
- Giới hạn tốc độ là 6.000 QPM (yêu cầu mỗi phút). Số liệu này được tính bằng tổng số yêu cầu phía máy khách và phía máy chủ cho tất cả các ứng dụng sử dụng thông tin xác thực của cùng một dự án.
Hiển thị thuộc tính trong ứng dụng của bạn
- Nếu ứng dụng của bạn dùng dịch vụ tự động hoàn thành theo phương thức lập trình, thì giao diện người dùng phải cho thấy thuộc tính "Do Google cung cấp" hoặc xuất hiện trong bản đồ mang thương hiệu Google.
- Nếu ứng dụng dùng tiện ích tự động hoàn thành, bạn không cần làm gì thêm (thuộc tính bắt buộc sẽ hiển thị theo mặc định).
- Nếu truy xuất và hiển thị thông tin bổ sung về địa điểm sau khi nhận địa điểm theo mã nhận dạng, bạn cũng phải hiển thị các thuộc tính bên thứ ba.
Để biết thêm thông tin chi tiết, vui lòng xem tài liệu về phân bổ.
Tối ưu hoá tính năng Tự động hoàn thành địa điểm
Phần này mô tả các phương pháp hay nhất để giúp bạn khai thác tối đa dịch vụ Tự động hoàn thành địa điểm.
Dưới đây là một số nguyên tắc chung:
- Cách nhanh nhất để phát triển một giao diện người dùng hoạt động hiệu quả là sử dụng Tiện ích Tự động hoàn thành của API Maps JavaScript, SDK Địa điểm dành cho Tiện ích Tự động hoàn thành dành cho Android hoặc SDK Địa điểm dành cho Kiểm soát giao diện người dùng Tự động hoàn thành dành cho iOS
- Ngay từ đầu, hãy tìm hiểu về các trường dữ liệu thiết yếu của tính năng Tự động hoàn thành địa điểm.
- Bạn không bắt buộc phải sử dụng trường xu hướng vị trí và trường giới hạn vị trí nhưng có thể có tác động đáng kể đến hiệu suất của tính năng tự động hoàn thành.
- Xử lý lỗi để đảm bảo ứng dụng sẽ xuống cấp nhẹ nếu API trả về lỗi.
- Hãy đảm bảo ứng dụng của bạn xử lý khi không có lựa chọn nào và cung cấp cho người dùng cách để tiếp tục.
Các phương pháp hay nhất để tối ưu hoá chi phí
Tối ưu hoá chi phí cơ bản
Để tối ưu hoá chi phí sử dụng dịch vụ Tự động hoàn thành địa điểm, hãy sử dụng mặt nạ trường trong các tiện ích Thông tin chi tiết về địa điểm và Tự động hoàn thành địa điểm để chỉ trả về các trường dữ liệu địa điểm mà bạn cần.
Tối ưu hoá chi phí nâng cao
Cân nhắc việc triển khai tính năng Tự động hoàn thành theo địa điểm theo phương thức lập trình để truy cập tính năng Giá cho mỗi yêu cầu và yêu cầu kết quả API Mã hoá địa lý về địa điểm đã chọn thay vì Thông tin chi tiết về địa điểm. Đặt giá theo yêu cầu được kết hợp với API mã hóa địa lý có hiệu quả hơn về chi phí so với đặt giá theo mỗi phiên (dựa trên phiên) nếu đáp ứng cả hai điều kiện sau:
- Nếu bạn chỉ cần vĩ độ/kinh độ hoặc địa chỉ của địa điểm đã chọn của người dùng, API Mã hoá địa lý sẽ cung cấp thông tin này thấp hơn lệnh gọi Thông tin chi tiết về địa điểm.
- Nếu người dùng chọn một cụm từ gợi ý của tính năng tự động hoàn thành trong phạm vi trung bình là 4 yêu cầu gợi ý Tự động hoàn thành hoặc ít hơn, thì tính năng Đặt giá cho mỗi yêu cầu có thể tiết kiệm chi phí hơn so với tính năng Đặt giá theo phiên.
Ứng dụng của bạn có yêu cầu thông tin nào khác ngoài địa chỉ và vĩ độ/kinh độ của thông tin dự đoán đã chọn không?
Có, cần thêm thông tin
Sử dụng tính năng Tự động hoàn thành dựa trên phiên hoạt động cùng với Thông tin chi tiết về địa điểm.
Vì ứng dụng của bạn đòi hỏi Thông tin chi tiết về địa điểm như tên địa điểm, trạng thái doanh nghiệp hoặc giờ mở cửa, nên việc triển khai tính năng Tự động hoàn thành địa điểm phải sử dụng mã phiên (theo phương thức lập trình hoặc tích hợp vào tiện ích JavaScript, Android hoặc iOS) với tổng chi phí là 0,017 đô la cho mỗi phiên cộng thêm SKU dữ liệu địa điểm tuỳ thuộc vào trường dữ liệu địa điểm mà bạn yêu cầu.
Triển khai tiện ích
Tính năng quản lý phiên được tự động tích hợp vào các tiện ích JavaScript, Android hoặc iOS. Điều này bao gồm cả yêu cầu Tự động hoàn thành về địa điểm và yêu cầu Chi tiết về địa điểm đối với cụm từ gợi ý đã chọn. Hãy nhớ chỉ định tham số fields
để đảm bảo rằng bạn chỉ yêu cầu những trường dữ liệu địa điểm mà bạn cần.
Triển khai có lập trình
Sử dụng mã thông báo phiên hoạt động với các yêu cầu Tự động hoàn thành địa điểm. Khi yêu cầu Thông tin chi tiết về địa điểm về cụm từ gợi ý đã chọn, hãy cung cấp các tham số sau:
- Mã địa điểm từ phản hồi Tự động hoàn thành địa điểm
- Mã thông báo phiên hoạt động được dùng trong yêu cầu Tự động hoàn thành địa điểm
- Tham số
fields
chỉ định các trường dữ liệu địa điểm mà bạn cần
Không, chỉ cần địa chỉ và vị trí
API mã hoá địa lý có thể là một lựa chọn tiết kiệm chi phí hơn so với Thông tin chi tiết về địa điểm cho ứng dụng của bạn, tuỳ thuộc vào hiệu suất sử dụng tính năng Tự động hoàn thành địa điểm của bạn. Hiệu quả của tính năng Tự động hoàn thành của mỗi ứng dụng sẽ khác nhau tuỳ thuộc vào nội dung mà người dùng đang nhập, nơi ứng dụng đang được sử dụng và việc liệu các phương pháp hay nhất để tối ưu hoá hiệu suất có được triển khai hay không.
Để trả lời câu hỏi sau, hãy phân tích xem trung bình một người dùng nhập bao nhiêu ký tự trước khi chọn dự đoán Tự động hoàn thành địa điểm trong ứng dụng của bạn.
Tính trung bình, người dùng của bạn có chọn một cụm từ dự đoán Tự động hoàn thành địa điểm trong 4 hoặc ít hơn không?
Có
Triển khai tính năng Tự động hoàn thành địa điểm theo phương thức lập trình mà không cần mã thông báo phiên và gọi API mã hoá địa lý trên thông tin dự đoán về địa điểm đã chọn.
API mã hoá địa lý gửi địa chỉ và toạ độ vĩ độ/kinh độ với giá 0,005 USD cho mỗi yêu cầu. Việc thực hiện 4 yêu cầu Tự động hoàn thành – Mỗi yêu cầu có chi phí là 0,01132 đô la nên tổng chi phí cho 4 yêu cầu cộng với một lệnh gọi API mã hoá địa lý về thông tin dự đoán địa điểm đã chọn sẽ là 0,01632, thấp hơn giá Tự động hoàn thành theo mỗi phiên là 0,017 đô la cho mỗi phiên.1
Hãy cân nhắc áp dụng các phương pháp hay nhất về hiệu suất để giúp người dùng nhận được cụm từ gợi ý mà họ đang tìm kiếm bằng ít ký tự hơn.
Không
Sử dụng tính năng Tự động hoàn thành dựa trên phiên hoạt động cùng với Thông tin chi tiết về địa điểm.
Vì số lượng yêu cầu trung bình mà bạn dự kiến thực hiện trước khi người dùng chọn dự đoán Tự động hoàn thành địa điểm vượt quá chi phí định giá cho mỗi phiên, nên việc triển khai tính năng Tự động hoàn thành của địa điểm phải sử dụng mã thông báo phiên cho cả yêu cầu Tự động hoàn thành địa điểm và yêu cầu Chi tiết địa điểm được liên kết với tổng chi phí là 0,017 USD cho mỗi phiên.1
Triển khai tiện ích
Tính năng quản lý phiên được tự động tích hợp vào các tiện ích JavaScript, Android hoặc iOS. Điều này bao gồm cả yêu cầu Tự động hoàn thành về địa điểm và yêu cầu Chi tiết về địa điểm đối với cụm từ gợi ý đã chọn. Hãy nhớ chỉ định tham số fields
để đảm bảo bạn chỉ yêu cầu các trường Dữ liệu cơ bản.
Triển khai có lập trình
Sử dụng mã thông báo phiên hoạt động với các yêu cầu Tự động hoàn thành địa điểm. Khi yêu cầu Thông tin chi tiết về địa điểm về cụm từ gợi ý đã chọn, hãy cung cấp các tham số sau:
- Mã địa điểm từ phản hồi Tự động hoàn thành địa điểm
- Mã thông báo phiên hoạt động được dùng trong yêu cầu Tự động hoàn thành địa điểm
- Tham số
fields
chỉ định các trường Dữ liệu cơ bản như địa chỉ và hình học
Cân nhắc việc trì hoãn các yêu cầu Tự động hoàn thành địa điểm
Bạn có thể áp dụng các chiến lược như trì hoãn yêu cầu Tự động hoàn thành địa điểm cho đến khi người dùng nhập ba hoặc bốn ký tự đầu tiên để ứng dụng của bạn đưa ra ít yêu cầu hơn. Ví dụ: việc tạo yêu cầu Tự động hoàn thành địa điểm cho từng ký tự sau khi người dùng nhập ký tự thứ ba có nghĩa là nếu người dùng nhập 7 ký tự rồi chọn một dự đoán mà bạn thực hiện một yêu cầu API mã hoá địa lý, thì tổng chi phí sẽ là 0,01632 (4 * 0,00283 USD Tự động hoàn thành cho mỗi yêu cầu + 0,005 USD Mã hoá địa lý).1
Nếu việc trì hoãn các yêu cầu khiến yêu cầu trung bình có lập trình của bạn giảm xuống dưới 4, thì bạn có thể làm theo hướng dẫn để triển khai tính năng Tự động hoàn thành địa điểm bằng API mã hóa địa lý. Xin lưu ý rằng người dùng có thể xem các yêu cầu trì hoãn là độ trễ mà có thể họ sẽ thấy các cụm từ gợi ý sau mỗi lần nhấn phím mới.
Hãy cân nhắc áp dụng các phương pháp hay nhất về hiệu suất để giúp người dùng nhận được cụm từ gợi ý mà họ đang tìm kiếm bằng ít ký tự hơn.
-
Chi phí được liệt kê ở đây được tính theo USD. Vui lòng tham khảo trang Thanh toán trên Nền tảng Google Maps để biết thông tin đầy đủ về giá.
Các phương pháp hay nhất về hiệu suất
Các nguyên tắc sau đây mô tả cách tối ưu hoá hiệu suất của tính năng Tự động hoàn thành địa điểm:
- Thêm các quy định hạn chế theo quốc gia, xu hướng vị trí và lựa chọn ưu tiên về ngôn ngữ (cho các hoạt động triển khai có lập trình) vào quá trình triển khai tính năng Tự động hoàn thành địa điểm. Không cần lựa chọn ngôn ngữ ưu tiên cho các tiện ích vì chúng chọn các lựa chọn ưu tiên về ngôn ngữ trên trình duyệt hoặc thiết bị di động của người dùng.
- Nếu tính năng Tự động hoàn thành của địa điểm đi kèm với bản đồ, bạn có thể phân bổ vị trí theo khung nhìn bản đồ.
- Trong trường hợp người dùng không chọn một trong các cụm từ gợi ý của tính năng Tự động hoàn thành, thường là do không có cụm từ gợi ý nào trong số đó là địa chỉ kết quả mong muốn, thì bạn có thể sử dụng lại nội dung do người dùng nhập ban đầu để cố gắng nhận được kết quả phù hợp hơn:
- Nếu bạn muốn người dùng chỉ nhập thông tin địa chỉ, hãy sử dụng lại thông tin đầu vào ban đầu của người dùng trong lệnh gọi đến API mã hoá địa lý.
- Nếu bạn muốn người dùng nhập cụm từ tìm kiếm cho một địa điểm cụ thể theo tên hoặc địa chỉ, hãy sử dụng yêu cầu Tìm địa điểm. Nếu kết quả chỉ được mong đợi ở một khu vực cụ thể, hãy sử dụng tính năng xu hướng vị trí.
- Người dùng nhập địa chỉ cửa hàng phụ ở những quốc gia chưa hỗ trợ tính năng Tự động hoàn thành của địa điểm cho địa chỉ phụ, ví dụ: Séc, Estonia và Lithuania. Ví dụ: địa chỉ bằng tiếng Séc "Stroupežnického 3191/17, Praha" sẽ đưa ra thông tin dự đoán một phần trong tính năng Tự động hoàn thành địa điểm.
- Người dùng nhập địa chỉ có tiền tố phân đoạn đường bộ như "23-30 29th St, Queens" ở Thành phố New York hoặc "47-380 Kamehameha Hwy, Kaneohe" trên đảo Kauai ở Hawai'i.
Khắc phục sự cố
Mặc dù có thể xảy ra nhiều lỗi, nhưng phần lớn các lỗi mà ứng dụng của bạn có thể gặp phải thường là do lỗi cấu hình (ví dụ: sử dụng sai khoá API hoặc khoá API được định cấu hình không chính xác) hoặc lỗi hạn mức (ứng dụng của bạn đã vượt quá hạn mức). Hãy xem phần Giới hạn sử dụng để biết thêm thông tin về hạn mức.
Lỗi xảy ra khi sử dụng bộ điều khiển tự động hoàn thành sẽ được trả về trong lệnh gọi lại onActivityResult()
. Hãy gọi Autocomplete.getStatus()
để nhận thông báo trạng thái cho kết quả.