12/08/2018, 15:55

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. 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à ...

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.

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

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.

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.

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_awidth="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.

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;
   }
}
0