앱을 만들다 보면 지도가 들어가는 앱을 만들게 되는 경우가 있다. GoogleMap API 등을 이용해서 앱을 만들게 되는 데, 이번에는 Jetpack Compose 기반의 GoogleMap 을 구현해 볼까 한다.
아직은 예전 java 코드에서 kotlin 코드로 이전 작업을 하는 중이라 미완성의 모습으로 보이는 데, 일단, 앱에 구글맵을 넣어 보았다.
먼저 gradle 파일에 추가해야 하는 것들은 다음과 같다.
// compose Maps
implementation 'com.google.android.gms:play-services-maps:18.1.0'
implementation "com.google.accompanist:accompanist-permissions:0.26.0-alpha"
implementation 'com.google.maps.android:maps-compose:2.5.3'
implementation "androidx.compose.foundation:foundation:$compose_version"
implementation 'com.google.maps.android:maps-compose-widgets:2.5.3'
버전에 따라서 달라질 수 는 있지만, 오늘 현재는 위와 같이 설정해 주면 된다.
다음은 manifast 파일에 권한 설정을 보겠다.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
일반적으로는 background_location 은 잘 사용하지 않는다, 구글에서도 background_location 권한을 사용하는 경우에는 사용자에게 권한 사용을 하고 있다는 안내를 통해서 권한 획득을 해야 한다고 하고 있고, fine_location 권한까지는 릴리즈 하는 동안에도 그다지 크게 통제(?)를 하지는 않지만, background_location 권한은 playstore에 릴리즈 하는 동안에도 까다롭게 심사를 하는 편이다.
이제 화면을 Jetpack compose 을 통해서 구현할 것이니 코드를 보도록 하겠다.
@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun MapsScreen (
navigator: DestinationsNavigator,
) {
// 기본위치 표시을 위해 싱가폴의 위치정보
val singapore = LatLng(1.35, 103.87)
// 지도의 크기 조정에 따른 상태 기록
val cameraPositionState = rememberCameraPositionState {
position = CameraPosition.fromLatLngZoom(singapore, 10f)
}
// 구글맵 환경설정 관리
var uiSettings by remember { mutableStateOf(MapUiSettings(zoomControlsEnabled = sp.getBoolean("isMyLocationEnabled", false))) }
// 구글맵의 형태등을 관리 MayType.NORMAL 일반적인 맵, SATELLITE 위성사진, HYBRID 일반과 위성사진의 혼합등등 설정
var properties by remember {
mutableStateOf(MapProperties(mapType = MapType.NORMAL, isMyLocationEnabled = sp.getBoolean("isMyLocationEnabled", false)))
}
// 권한 획득에 관한 설정
val permissionState = rememberPermissionState(
permission = Manifest.permission.ACCESS_FINE_LOCATION,
)
....
when (permissionState.status) {
PermissionStatus.Granted -> {
Box(Modifier.fillMaxWidth().height(screenHeight * .3f)) {
GoogleMap(
modifier = Modifier.matchParentSize(),
cameraPositionState = cameraPositionState,
properties = properties,
uiSettings = uiSettings,
) {
Marker(
state = MarkerState(position = singapore),
title = "Singapore",
snippet = "Marker in Singapore"
)
}
Switch(
checked = uiSettings.zoomControlsEnabled,
onCheckedChange = {
uiSettings = uiSettings.copy(zoomControlsEnabled = it)
properties = properties.copy(isMyLocationEnabled = it)
}
)
}
}
else -> {
navigator.navigate(HomeScreenDestination)
}
}
}
}
대략적인 구글맵을 사용한 코드는 위와 같이 구현이 될 수 있다. 좀 더 자세한 것은 아래 링크를 참고해서 다시 봐야 할 듯 하지만...
https://developers.google.com/maps/documentation/android-sdk/maps-compose
이제 실행 되는 모습을 잠시 살펴보면서 마무리를 해야겠다.
'모바일 앱(안드로이드)' 카테고리의 다른 글
안드로이드 앱 만들기 : material dialog 만들기 예제 (4) | 2022.08.24 |
---|---|
안드로이드 앱 만들기 : Android Studio Update Dolphin Beta 5 (7) | 2022.08.14 |
안드로이드 앱 만들기 : kotlin 배우기를 위한 공유 (0) | 2022.08.03 |
안드로이드 앱 만들기 : jetpack compose 에서 SnackBar 을 쉽게... (0) | 2022.08.02 |
안드로이드 앱 만들기 : navigation 을 편리하게 ? (두번째 이야기) (7) | 2022.08.01 |