이 튜토리얼에서는 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(실행) 아이콘을 클릭하세요. 실행 옵션에서 본인의 모바일 기기를 선택하면, 기기 화면에 현재 위치가 지도 위에 마커와 함께 표시되는 것을 확인할 수 있습니다.
권한 요청 팝업이 나타나면 위치 권한을 허용해야 정상적으로 현재 위치를 불러올 수 있습니다. 에뮬레이터로 테스트하는 경우, 에뮬레이터 설정에서 가상 위치를 지정해 주어야 합니다.