Android

[Android] 구글맵 사용하기: OnMapReadyCallback

eyoo 2022. 7. 29. 11:33

구글맵을 사용하려면 설정해야 하는것이 몇가지 있다.

 

자주 바뀌니 공식 홈페이지의 매뉴얼을 참고하여 설정하자.

 

구글맵 공식 페이지:

https://developers.google.com/maps/documentation/android-sdk/config?hl=ko

 

Android 스튜디오 프로젝트 설정  |  Android용 Maps SDK  |  Google Developers

의견 보내기 Android 스튜디오 프로젝트 설정 이 페이지에서는 빠른 시작에 자세히 설명되어 있는 Google 지도 템플릿을 사용하지 않고 Android용 Maps SDK를 사용하도록 Android 스튜디오 프로젝트를 구

developers.google.com

 

gradle에 코드 추가

 

module:

implementation 'com.google.android.gms:play-services-maps:18.0.2'

 

 

root:

id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' version '2.0.1' apply false

 

 

module의 plugins:

id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'

 

 

이제 API키를 등록한다.

 

API 키 사용하는 매뉴얼:

https://developers.google.com/maps/documentation/android-sdk/get-api-key?hl=ko 

 

API 키 사용  |  Android용 Maps SDK  |  Google Developers

의견 보내기 API 키 사용 플랫폼 선택: Android iOS의 경우 자바스크립트 여기에서는 Android용 Maps SDK에 사용할 API 키를 만들어 앱에 추가하고 키를 제한하여 앱을 보호하는 방법을 설명합니다. SDK를

developers.google.com

 

구글 API 페이지

https://console.cloud.google.com/project/_/google/maps-apis/credentials?hl=ko 

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

# 구글 API가 없으면 만들어야 한다.

 

 

Maps를 사용한 적이 없다면 라이브러리로 이동하여 사용으로 설정한다.

 

 

 

 

이제 API의 사용자 인증정보로 이동하여 제한사항에서 Maps SDK for Android를 추가한다.

 

 

 

Gradle의 local.properties 에 위에서 설정해준 API 키를 입력한다.

MAPS_API_KEY=YOUR_API_KEY

 

 

매니페스트의 application 안에 meta-data를 작성한다

 

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="${MAPS_API_KEY}" />

<meta-data
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />

 

 

그 위에 권한도 추가한다.

 

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

# ACCESS_COARSE_LOCATION은 기능을 사용하기위해 임의로 추가했다.

 

 

이제 레이아웃을 구성하자

 

매뉴얼:

https://developers.google.com/maps/documentation/android-sdk/map?hl=ko 

 

지도 추가하기  |  Android용 Maps SDK  |  Google Developers

의견 보내기 지도 추가하기 플랫폼 선택: Android iOS 자바스크립트 이 주제에서는 Android용 Maps SDK를 사용하도록 프로젝트를 구성한 후 Android 앱에 기본 지도를 추가하는 방법을 설명합니다. 지도를

developers.google.com

 

 

구글에서 제공하는 코드를 사용하면 쉽게 작성할수있다.

 

# 위의 코드를 복사한다.

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

 

 

이제 메인 엑티비티에서 OnMapReadyCallback을 implement 한다.

 

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onMapReady(@NonNull GoogleMap googleMap) {
        
    }

 

 

SupportMapFragment로 구글맵을 사용하겠다는 코드를 작성한다.

 

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 구글맵 사용하겠다는 코드 작성
        SupportMapFragment mapFragment =
                (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(@NonNull GoogleMap googleMap) {

    }
}

 

 

이대로 실행시키면 지도가 잘 나오는것을 볼수있다.

 

 

 

 

moveCamera로 사용자의 위치가 지도의 중심이 될수 있도록 설정한다.

 

 

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 구글맵 사용하겠다는 코드 작성
        SupportMapFragment mapFragment =
                (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(@NonNull GoogleMap googleMap) {
        // 내 위치가 지도의 중심이 될수 있도록

        LatLng myLocation = new LatLng(37.5428428, 1266772096);

//        googleMap.moveCamera(CameraUpdateFactory.newLatLng( myLocation ));
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom( myLocation,18 ));
    }

# newLatLngZoom을 사용하여 확대한 상태로 보여준다.

 

 

마커를 표시하여 내 위치 혹은 다른 곳의 위치를 보여줄수있다.

 

    @Override
    public void onMapReady(@NonNull GoogleMap googleMap) {
        // 내 위치가 지도의 중심이 될수 있도록

        LatLng myLocation = new LatLng(37.5428428, 126.6772096);

//        googleMap.moveCamera(CameraUpdateFactory.newLatLng( myLocation ));
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom( myLocation,18 ));

        googleMap.addMarker(new MarkerOptions().position(myLocation).title("내위치"));
        googleMap.addMarker(new MarkerOptions().position(
                new LatLng(37.5438428, 126.6772096)).title("마커2"))
                .setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));

        googleMap.addMarker(new MarkerOptions().position(
                new LatLng(37.5438428, 126.6762096)).title("마커3"))
                .setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));

    }

 

 

클릭하면 원하는 기능이 구현될수 있도록 GoogleMap.OnMarkerClickListener를 implement한다.

 

# onMarkerClick를 오버라이드 한다.

 

 

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback, GoogleMap.OnMarkerClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 구글맵 사용하겠다는 코드 작성
        SupportMapFragment mapFragment =
                (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(@NonNull GoogleMap googleMap) {
        // 내 위치가 지도의 중심이 될수 있도록

        LatLng myLocation = new LatLng(37.5428428, 126.6772096);

//        googleMap.moveCamera(CameraUpdateFactory.newLatLng( myLocation ));
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom( myLocation,18 ));


        // 마커에 tag추가
        googleMap.addMarker(new MarkerOptions().position(myLocation).title("내위치")).setTag(0);
        googleMap.addMarker(new MarkerOptions().position(
                new LatLng(37.5438428, 126.6772096)).title("마커2")).setTag(1);
//                .setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));

        googleMap.addMarker(new MarkerOptions().position(
                new LatLng(37.5438428, 126.6762096)).title("마커3")).setTag(2);
//                .setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));

        googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

        // 클릭하면 처리되도록
        googleMap.setOnMarkerClickListener(this);

    }

    @Override
    public boolean onMarkerClick(@NonNull Marker marker) {

        int index = (int) marker.getTag();

        if(index == 0){
            Toast.makeText(this, "내위치 입니다.", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "내위치가 아닙니다.", Toast.LENGTH_SHORT).show();
        }

        return false;
    }
}

# setMapType으로 지도 형식을 바꿀수있다.

 

 

토스트 알림이 잘 나오는것을 확인할수있다.