Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

Kotlin으로 안드로이드 구글 지도에 현재 위치 표시하기 – 단계별 완벽 가이드

이 튜토리얼에서는 Kotlin을 사용해 안드로이드 앱에서 구글 지도(Google Maps)에 사용자의 현재 위치를 표시하는 방법을 단계별로 알아봅니다. 위치 권한 요청부터 FusedLocationProviderClient를 활용한 좌표 가져오기, 지도에 마커 추가까지 전체 과정을 다룹니다.

1단계: 새 프로젝트 생성

Android Studio를 실행하고 File → New Project 메뉴로 이동한 뒤, 필요한 모든 정보를 입력하여 새 프로젝트를 생성합니다. 언어는 Kotlin을 선택하세요.

2단계: 레이아웃 파일 작성

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다. 지도를 화면 전체에 표시하기 위해 SupportMapFragment를 사용합니다.

<fragment xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:id="@+id/myMap"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" />

3단계: Gradle 의존성 추가

build.gradle(Module: app) 파일에 아래 의존성을 추가합니다. 지도 서비스와 위치 서비스 두 가지가 필요합니다.

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

4단계: MainActivity.kt 작성

src/MainActivity.kt 파일에 다음 코드를 추가합니다. 이 코드는 위치 권한을 확인·요청하고, 마지막으로 알려진 위치를 가져온 뒤 지도가 준비되면 해당 좌표에 마커를 표시합니다.

import android.Manifest
import android.content.pm.PackageManager
import android.location.Location
import android.os.Bundle
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.fragment.app.FragmentActivity
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices
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

class MainActivity : FragmentActivity(), OnMapReadyCallback {

    private lateinit var currentLocation: Location
    private lateinit var fusedLocationProviderClient: FusedLocationProviderClient
    private val permissionCode = 101

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        fusedLocationProviderClient =
            LocationServices.getFusedLocationProviderClient(this@MainActivity)
        fetchLocation()
    }

    private fun fetchLocation() {
        if (ActivityCompat.checkSelfPermission(
                this, Manifest.permission.ACCESS_FINE_LOCATION) !=
            PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
                this, Manifest.permission.ACCESS_COARSE_LOCATION) !=
            PackageManager.PERMISSION_GRANTED
        ) {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), permissionCode)
            return
        }
        val task = fusedLocationProviderClient.lastLocation
        task.addOnSuccessListener { location ->
            if (location != null) {
                currentLocation = location
                Toast.makeText(
                    applicationContext,
                    currentLocation.latitude.toString() + "" +
                        currentLocation.longitude,
                    Toast.LENGTH_SHORT
                ).show()
                val supportMapFragment =
                    (supportFragmentManager.findFragmentById(R.id.myMap) as
                        SupportMapFragment?)!!
                supportMapFragment.getMapAsync(this@MainActivity)
            }
        }
    }

    override fun onMapReady(googleMap: GoogleMap?) {
        val latLng = LatLng(currentLocation.latitude, currentLocation.longitude)
        val markerOptions = MarkerOptions().position(latLng).title("I am here!")
        googleMap?.animateCamera(CameraUpdateFactory.newLatLng(latLng))
        googleMap?.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 5f))
        googleMap?.addMarker(markerOptions)
    }

    override fun onRequestPermissionsResult(
        requestCode: Int, permissions: Array<String?>,
        grantResults: IntArray
    ) {
        when (requestCode) {
            permissionCode -> if (grantResults.isNotEmpty() && grantResults[0] ==
                PackageManager.PERMISSION_GRANTED
            ) {
                fetchLocation()
            }
        }
    }
}

5단계: 구글 맵 API 키 발급

지도를 사용하려면 Google Cloud Platform Console에서 API 키(map_key)를 발급받아야 합니다. 아래 순서대로 진행하세요.

  • Google Cloud Platform Console에 접속합니다.

  • 상단의 프로젝트 드롭다운 메뉴를 클릭하여 API 키를 추가할 프로젝트를 선택하거나 새로 생성합니다.

  • 메뉴 버튼을 클릭하고 APIs & Services → Credentials(사용자 인증 정보)로 이동합니다.

  • Credentials 페이지에서 Create credentials → API key를 클릭합니다. 그러면 새로 생성된 API 키가 대화상자에 표시됩니다.

  • Close를 클릭해 창을 닫습니다.

  • 새 API 키는 Credentials 페이지의 API keys 목록에서 확인할 수 있습니다. 참고: 실제 운영 환경에 배포하기 전에는 반드시 API 키에 사용 제한(restriction)을 설정해야 안전합니다.

6단계: AndroidManifest.xml 설정

위치 권한과 발급받은 API 키를 매니페스트 파일에 등록합니다. <meta-data> 태그의 value 부분에 본인이 발급받은 API 키를 입력하세요.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.q15">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

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

    </application>
</manifest>

앱 실행 및 결과 확인

이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 스마트폰을 컴퓨터에 연결했다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run(실행) 아이콘을 클릭하세요. 실행 옵션에서 본인의 모바일 기기를 선택하면, 기기 화면에 현재 위치가 지도 위에 마커와 함께 표시되는 것을 확인할 수 있습니다.

권한 요청 팝업이 나타나면 위치 권한을 허용해야 정상적으로 현재 위치를 불러올 수 있습니다. 에뮬레이터로 테스트하는 경우, 에뮬레이터 설정에서 가상 위치를 지정해 주어야 합니다.