Android Google Maps: Searching for a place
Xin chào!
Đây là bài số 3 trong chuỗi bài về Google Maps. Chúng ta vẫn cần nội dung trong project cũ nên yêu cầu bạn đã follow theo 2 bài trước ở links dưới nhé:
Bài 1: Android: Google Maps
Bài 2: Android Google Maps: Show your current location
Kết thúc 2 bài trước ứng dụng của bạn đã sử dụng được Google Maps và hiển thị vị trí hiện tại trên bản đồ. Bài viết này tôi sẽ hướng dẫn bạn tìm kiếm một địa điểm và thêm điểm này vào bản đồ. Việc này cũng rất dễ dàng thôi vì Google đã hỗ trợ chúng ta rất đầy đủ bằng thư viện Places Autocomplete.
*Lưu ý, thư viện này có tính phí dựa trên số lượng request tìm kiếm. Tuy nhiên bạn chỉ cần truy cập vào trang billing của Google, tạo một free Billing Account và add vào project. Việc tạo free account này cần có thẻ tín dụng để xác thực bạn không phải là robot, và bạn sẽ không bị tính phí mà còn được free 150.000 request/ngày. Bạn sẽ chỉ bị tính phí khi tự mình kích hoạt sang tài khoản trả tiền mà thôi.
Bầy giờ hãy mở project lên và cùng tiến hành implement nào.
Ứng dụng sẽ cần sử dụng Internet, bạn hãy thêm permission vào AndroidManifest.xml.
<uses-permission android:name="android.permission.INTERNET" />
Để tìm kiếm 1 địa điểm, chúng ta sẽ sử dụng thư viện Places Autocomplete. Đầu tiên truy cập vào Google Cloud Platform Console để thực hiện ENABLE dịch vụ Places API cho project. Cách làm tương tự như dịch vụ Maps SDK for Android như đã hướng dẫn trong bài 1.
Tiếp theo hãy khai báo thư viện dependencies của ứng dụng, trong file app/build.gradle
dependencies { ... implementation 'com.google.android.libraries.places:places:1.1.0' }
Khi ứng dụng khởi chạy, ta sẽ khởi tạo thư viện này. Cùng với đó bạn thêm 1 button vào activity_maps.xml và xử lý sự kiện trong file MapsActivity.java khi click vào nó chúng ta sẽ gọi thư viện Places Autocomple để tìm địa điểm.
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" tools:context=".MapsActivity"> <Button android:id="@+id/btnSearch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal|bottom" android:layout_margin="15dp" android:text="Search" /> <fragment xmlns:map="http://schemas.android.com/apk/res-auto" android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, LocationListener { ... private static final int REQUEST_CODE_AUTOCOMPLETE_TO_PLACE = 3; ... @Override protected void onCreate(Bundle savedInstanceState) { ... // Initialize Places. Places.initialize(this, getResources().getString(R.string.google_maps_key)); findViewById(R.id.btnSearch).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { List<Place.Field> fields = Arrays.asList(Place.Field.ID, Place.Field.ADDRESS, Place.Field.NAME, Place.Field.LAT_LNG); Intent intent = new Autocomplete.IntentBuilder(AutocompleteActivityMode.FULLSCREEN, fields) .setCountry("VN") .build(MapsActivity.this); startActivityForResult(intent, REQUEST_CODE_AUTOCOMPLETE_TO_PLACE); } }); } ... }
Kết quả của việc tìm kiếm sẽ được trả về trong hàm onActivityResult, chỉ cần lấy thông tin địa điểm lưu vào 1 điểm Marker và hiển thị nó lên bản đồ.
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, LocationListener { ... private Marker placeMarker; ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_ENABLE_LOCATION_SERVICE) { ... } else if (requestCode == REQUEST_CODE_AUTOCOMPLETE_TO_PLACE) { if (resultCode == RESULT_OK) { Place place = Autocomplete.getPlaceFromIntent(data); MarkerOptions placeMarkerOptions = new MarkerOptions().position(place.getLatLng()).title(place.getName()); if (placeMarker != null) placeMarker.remove(); placeMarker = mMap.addMarker(placeMarkerOptions); } else if (resultCode == AutocompleteActivity.RESULT_ERROR) { // Handle the error. Status status = Autocomplete.getStatusFromIntent(data); Toast.makeText(this, status.getStatusMessage(), Toast.LENGTH_SHORT).show(); } else if (resultCode == RESULT_CANCELED) { // The user canceled the operation. } } } ... }
Vậy là đã hoàn thành xong việc implement, chạy ứng dụng lên và bạn hãy thử tìm một vài địa điểm yêu thích để xem kết quả nhé.
Hẹn gặp lại bạn trong bài tiếp theo tôi sẽ hướng dẫn bạn tìm đường từ vị trí hiện tại đến địa điểm bạn đã tìm ở trên.
See you!