Google map trong Android

Các ứng dụng có các tính năng liên quan tới địa điểm, nhà hàng, khách sạn… thì việc hiển thị bản đồ là 1 điều tất yếu. Bài viết dưới đây là cách tích hợp Google Map vào ứng dụng một cách cơ bản nhất.

Bước 1: Mở SDK manager và cài thêm gói Google Play Services

Screen Shot 2016-07-31 at 11.57.55 PM.png

Bước 2: Tạo 1 project Android mới, hoặc trong project hiện tại tạo 1 activity mới bằng trình tạo Activity của Studio

Screen Shot 2016-08-01 at 12.00.26 AM.png Chọn tạo mới 1 Google Map Activity rồi ấn Next. Bước sau có thể để tên mặc định và nhấn Finish. Screen Shot 2016-08-01 at 11.05.53 AM.png

Studio sẽ khởi chạy Gradle và build ứng dụng của bạn. Khi hoàn thành, Studio sẽ mở ra 2 file là google_maps_api.xml và MapsActivity.java (Tên có thể khác tùy vào cách bạn đặt). Trong file google_maps_api.xml có các thông tin để có thể lấy Google Maps API key.

Bước 3: Lấy Google Map API key. Có 2 cách đơn giản để lấy được API key

Cách 1: Sử dụng các liên kết có trong hướng dẫn của file google_maps_api.xml ở trên

  • Dùng đường link được cung cấp trong tập tin google_maps_api.xml và truy cập bằng trình duyệt của bạn. Các liên kết sẽ đưa bạn đến Google API Console.

  • Thực hiện theo các bước để tạo một dự án mới trên bàn điều khiển hoặc chọn một dự án hiện có.

  • Tạo một key API Android.

  • Sao chép kết quả API key, trở lại Android Studio, và dán các API key vào thẻ <string> trong file google_maps_api.xml.

Cách 2: Sử dụng các thông tin cung cấp trong file google_maps_api.xml Android Studio đã tạo ra

  • Sao chép các thông tin cung cấp trong tệp google_maps_api.xml.

  • Tới Google API Console bằng trình duyệt.

  • Sử dụng các thông tin sao chép để thêm ứng dụng một API key hiện có hoặc tạo một API key mới.

Bước 4: Chạy thử project. Nó sẽ hiện ra 1 bản đồ được đánh 1 dấu đỏ ở Sydney, Úc

Ngoài ra bạn có thể xem thêm 1 số file mà Android Studio đã tự động tạo ra để hiểu thêm về Google Map

File layout XML

Mặc định, file XML được tạo ra với đường dẫn res/layout/activity_maps.xml. Nội dụng của file là:

<fragment 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:id="@+id/map"
    tools:context=".MapsActivity"
    android:name="com.google.android.gms.maps.SupportMapFragment" />

File code Java

1 file Java được tạo ra với tên MapsActivity.java có nội dung:

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney, Australia, and move the camera.
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }
}

Nếu file activity không chứa đoạn code như trên thì bạn hãy sửa nội dung của file giống như đoạn code trên để có thể sử dụng được Google Map.

Bước 5: Lấy vị trí hiện tại của thiết bị thông qua GPS

Với các máy có version dưới 6.0 thì chúng ta chỉ cần khai báo quyền truy cập GPS thông qua file Manifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

Và các máy từ 6.0 trở lên thì cần phải yêu cầu quyền truy cập thông qua runtime permission. Ở trong hàm onResume() trong Activity, chúng ta khai báo như sau:

private static final int REQUEST_CODE_GPS_PERMISSION = 100;
    @Override
 protected void onResume() {
     super.onResume();
     if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
             == PackageManager.PERMISSION_GRANTED) {
         //TODO: Get current location
         getCurrentLocation();
     } else {
         requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                     REQUEST_CODE_GPS_PERMISSION);
     }
 }
 
     private void getCurrentLocation() {
     FusedLocationProviderClient mFusedLocationClient =
             LocationServices.getFusedLocationProviderClient(this);
     mFusedLocationClient.getLastLocation()
             .addOnSuccessListener(this, new OnSuccessListener<Location>() {
                 @Override
                 public void onSuccess(Location location) {
                     if (location == null) {
                         return;
                     }
                     LatLng currentLocation =
                             new LatLng(location.getLatitude(), location.getLongitude());
                     mMap.addMarker(new MarkerOptions().position(currentLocation).title("Marker in current location"));
                     mMap.moveCamera(CameraUpdateFactory.newLatLng(currentLocation));
                 }
             });
 }

Sau đó kiểm tra quyền truy cập GPS thông qua hàm onRequestPermissionsResult() :

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
       @NonNull int[] grantResults) {
   switch (requestCode) {
       case REQUEST_CODE_GPS_PERMISSION:
           for (int grantResult : grantResults) {
               if (grantResult != PackageManager.PERMISSION_GRANTED) {
                   //TODO: Action when permission denied
               }
           }
           break;
   }
}