자바 안드로이드 앱개발 강좌, 구글 지도 활용하기

안드로이드 앱 개발에서 구글 지도를 사용하는 것에 대한 이해는 많은 개발자들에게 큰 가치가 있습니다.
구글 지도 API를 활용하면 사용자가 실시간으로 지도 정보를 보고, 특정 위치를 찾고, 내비게이션 기능을 제공하는 등의
다양한 기능을 구현할 수 있습니다. 이번 글에서는 자바를 사용하여 안드로이드 앱에서 구글 지도를 구현하는 방법과
주요 기능들을 자세히 설명하고 몇 가지 예제 코드를 제공하겠습니다.

1. 구글 지도 API란?

구글 지도 API는 구글에서 제공하는 지도 정보를 사용하여 웹사이트나 모바일 애플리케이션에서 지도 기능을 쉽게
구현할 수 있도록 해주는 서비스입니다. 이 API를 사용하면 사용자가 원하는 지역의 지도, 마커, 경로 등의 정보
를 제공받을 수 있습니다. 안드로이드 앱에서 구글 지도를 사용하기 위해서는 구글 맵 API를 연동해야 합니다.

2. 구글 지도 API 키 생성하기

구글 지도를 앱에서 사용하기 위해서는 API 키가 필요합니다. 다음은 API 키를 생성하는 방법입니다.

  1. 구글 클라우드 플랫폼에 로그인합니다. (Google Cloud Console)
  2. 새 프로젝트를 생성합니다.
  3. 대시보드에서 ‘API 및 서비스’ > ‘라이브러리’로 이동합니다.
  4. ‘Maps SDK for Android’를 검색하여 활성화합니다.
  5. ‘API 및 서비스’ > ‘사용자 인증 정보’로 이동하여 API 키를 생성합니다.

3. 안드로이드 프로젝트 설정

API 키 준비가 완료되면 안드로이드 프로젝트를 설정합니다. Android Studio를 열고 새로운 프로젝트를 생성합니다.
여기서는 ‘Empty Activity’를 선택하겠습니다.

3.1. Gradle 파일 수정

`build.gradle` 파일을 열고 다음 의존성을 추가합니다:


    dependencies {
        implementation 'com.google.android.gms:play-services-maps:17.0.1' // 구글 맵 의존성
    }
    

3.2. AndroidManifest.xml 수정

`AndroidManifest.xml` 파일에서 다음과 같이 권한과 API 키를 추가합니다:


    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.mymapapp">

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

        <application
            ...
            android:meta-data
                android:name="com.google.android.geo.API_KEY"
                android:value="YOUR_API_KEY"/>
        </application>
    </manifest>
    

4. 지도 화면 구현하기

이제 본격적으로 지도를 화면에 표시해보겠습니다. `activity_main.xml` 파일을 수정하여 지도 프래그먼트를 추가합니다.


    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">

        <fragment
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    </LinearLayout>
    

4.1. MainActivity.java 구현

지도를 제어하기 위해 `MainActivity.java` 파일을 다음과 같이 수정합니다.


    package com.example.mymapapp;

    import android.os.Bundle;
    import androidx.fragment.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 MainActivity extends FragmentActivity implements OnMapReadyCallback {

        private GoogleMap mMap;

        @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(GoogleMap googleMap) {
            mMap = googleMap;

            // 예시 위치: 서울
            LatLng seoul = new LatLng(37.5665, 126.978);
            mMap.addMarker(new MarkerOptions().position(seoul).title("Marker in 서울"));
            mMap.moveCamera(CameraUpdateFactory.newLatLng(seoul));
        }
    }
    

5. 마커 추가하기

사용자가 다양한 장소를 쉽게 찾을 수 있도록 마커를 추가하는 기능을 구현합니다. 예시 코드에서 이미 한 마커를 추가했지만,
여러 개의 마커를 추가하는 방법을 보여드리겠습니다.


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

        // 서울 마커
        LatLng seoul = new LatLng(37.5665, 126.978);
        mMap.addMarker(new MarkerOptions().position(seoul).title("Marker in 서울"));

        // 부산 마커
        LatLng busan = new LatLng(35.1796, 129.0756);
        mMap.addMarker(new MarkerOptions().position(busan).title("Marker in 부산"));

        // 대구 마커
        LatLng daegu = new LatLng(35.8714, 128.6014);
        mMap.addMarker(new MarkerOptions().position(daegu).title("Marker in 대구"));

        // 카메라 위치 변경
        mMap.moveCamera(CameraUpdateFactory.newLatLng(seoul));
    }
    

6. 위치 접근 허가 요청하기

위치 기반 서비스를 구현할 때는 사용자로부터 위치 접근 권한을 요청해야 합니다. 다음은 위치 권한을 요청하는
방법입니다.


    import android.Manifest;
    import android.content.pm.PackageManager;
    import androidx.core.app.ActivityCompat;

    private static final int LOCATION_PERMISSION_REQUEST_CODE = 1;

    @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);

        // 위치 권한 요청
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE);
        } else {
            mMap.setMyLocationEnabled(true);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                    mMap.setMyLocationEnabled(true);
                }
            }
        }
    }
    

7. 현재 위치 표시하기

사용자의 현재 위치를 지도에 표시하는 방법을 구현해보겠습니다. 방금 추가한 코드와 함께 .setMyLocationEnabled(true)
메서드를 통해 현재 위치를 표시할 수 있습니다. 현재 위치를 중심으로 카메라를 이동하려면 다음과 같이 수정합니다.


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

        // 사용자 위치 접근 허용 여부에 따라서 현재 위치 표시
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            mMap.setMyLocationEnabled(true);
        }

        // 서울 마커
        LatLng seoul = new LatLng(37.5665, 126.978);
        mMap.addMarker(new MarkerOptions().position(seoul).title("Marker in 서울"));
        
        // 카메라 위치 변경
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(seoul, 10));
    }
    

8. 경로 찾기 기능 구현하기

경로 찾기 기능은 사용자와 특정 목적지 간의 길을 찾는 데 사용됩니다. Google Directions API를 활용하여
경로를 찾을 수 있지만, 이를 위해서는 추가적인 작업이 필요합니다.

Directions API를 호출하기 위해 Axios 또는 Retrofit 같은 HTTP 클라이언트를 사용하여 요청을 보내고,
반환된 경로 데이터를 분석해 지도의 Polyline에 표시할 수 있습니다. 이 부분은 간단하게 설명하겠습니다.


    // Retrofit을 이용한 Directions API 호출
    public interface DirectionsService {
        @GET("directions/json")
        Call getDirections(@Query("origin") String origin,
                                          @Query("destination") String destination,
                                          @Query("key") String apiKey);
    }
    

이 API를 통해 얻은 경로 데이터를 통해 Polyline을 지도에 추가하여 경로를 표시할 수 있습니다.

9. 결론

이 글에서는 안드로이드 앱 개발에서 구글 지도를 활용하기 위한 기본적인 설정과 기능 구현 방법을
살펴보았습니다. 구글 지도 API를 활용하면 다양한 위치 기반 서비스를 제공하는 강력한 애플리케이션을
만들 수 있습니다. 추가로 사용자 친화적인 기능을 추가하고, Directions API를 활용하여 복잡한 경로
찾기 기능을 구현해보시기를 추천합니다.

앱 개발의 길은 쉽지 않지만, 구글 지도를 통해 다채로운 사용자 경험을 제공할 수 있는 가능성은 무한합니다.
여러분의 아이디어를 이끌어내는 데 도움이 되었길 바랍니다.

© 2023 블로그 아이디어