반응형
Notice
Recent Posts
Recent Comments
Link
NOW OR NEVER
[Android] Google Map API & Splash 본문
반응형
Google Map API (Mac 기준)
- 1. https://console.cloud.google.com/welcome 접속
Google 클라우드 플랫폼
로그인 Google 클라우드 플랫폼으로 이동
accounts.google.com
- 2. 프로젝트 만들기
- 3. 사용 설정한 api 및 서비스 - api 및 서비스 사용 설정 - Maps SDK for Android
- 4. api 키 제한 설정
- 안드로이드 스튜디오 터미널에서 SHA-1 인증서 디지털 지문 얻기
- window : gradlew signingReport 입력 후 ctrl + enter
- mac : keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android 입력 후 enter
- 안드로이드 스튜디오 터미널에서 SHA-1 인증서 디지털 지문 얻기

- 5. manifest 파일에 application 태그 안에 아래 코드 작성
<meta-data android:name="com.google.android.geo.API_KEY"
android:value="API 키 값"/>
- 6. settings 메뉴 - Appearance & Behavior - System settings - Android SDK - SDK Tools - Google Play Services 선택 - ok
- 7. build.gradle(app) : dependecies에 아래 코드 추가
implementation 'com.google.android.gms:play-services-maps:18.1.0'
implementation 'com.google.android.gms:play-services-location:21.0.1'
- 8. main activity의 layout 파일(activity_main.xml) 구성
<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map_fragment"
android:name="com.google.android.gms.maps.SupportMapFragment"/>
</LinearLayout>
- 9. main activity 파일에서 onCreate 메소드 안에 아래 코드 추가
MapsInitializer.initialize(this, MapsInitializer.Renderer.LATEST, 콜백메서드);
현재 위치 지도에 표시하기
- 1. manifest 파일에 아래 권한 추가
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
- 2. main activity에 승인 받을 권한 목록과 위치 측정 리스너, 구글 지도 객체를 담을 변수, 마커 선언
// 허용받을 권한 리스트
val permissionList = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
// 위치 측정 리스너
var myLocationListener:LocationListener? = null
// 구글 지도 객체를 담을 변수
lateinit var mainGoogleMap: GoogleMap
// 현재 사용자 위치에 표시되는 마커
var myMarker: Marker? = null
- 3. 매개변수로 들어오는 위도 경도값을 통해 구글 지도를 해당 위치로 이동시키는 메서드 생성
// 매개변수로 들어오는 위도 경도값을 통해 구글 지도를 해당 위치로 이동시킨다.
fun setMyLocation(location: Location){
// 위치 측정을 중단한다.
if(myLocationListener != null) {
val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
locationManager.removeUpdates(myLocationListener!!)
myLocationListener = null
}
// val str1 = "위도 : ${location.latitude}, 경도 : ${location.longitude}"
// Toast.makeText(this@MainActivity, str1, Toast.LENGTH_SHORT).show()
// 위도와 경도를 관리하는 객체를 생성한다.
val latLng = LatLng(location.latitude, location.longitude)
// 지도를 이용시키기 위한 객체를 생성한다.
//val cameraUpdate = CameraUpdateFactory.newLatLng(latLng)
val cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 15f)
// 지도를 이동한다.
// mainGoogleMap.moveCamera(cameraUpdate)
mainGoogleMap.animateCamera(cameraUpdate)
// 현재 위치에 마커를 표시한다.
val markerOptions = MarkerOptions()
markerOptions.position(latLng)
// 마커 이미지를 변경한다.
// val markerBitmap = BitmapDescriptorFactory.fromResource(android.R.drawable.ic_menu_mylocation)
// markerOptions.icon(markerBitmap)
// 기존에 표시한 마커를 제거한다.
if(myMarker != null){
myMarker?.remove()
myMarker = null
}
// myMarker = mainGoogleMap.addMarker(markerOptions)
}
- 4. 현재 위치 측정 메서드 생성
// 현재 위치 측정
fun getMyLocation(){
// 권한 확인(두 개의 권한에 대한 허용 여부 가져오기, 거부되면 PERMISSION_DENIED 값 가져옴 허용 되면 PERMISSION_GRANTED )
val a1 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_FINE_LOCATION)
val a2 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_COARSE_LOCATION)
// 두 권한에 대하여 허용 되어 있으면
if(a1 == PackageManager.PERMISSION_GRANTED && a2 == PackageManager.PERMISSION_GRANTED){
val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
// 측정을 중단시키려면 위치 측정 리스너 객체 필요
// 위치 측정 리스너
myLocationListener = object : LocationListener {
override fun onLocationChanged(p0: Location) {
setMyLocation(p0)
}
}
// gps provider 하나만 가지고 해도 된다.
// 매개변수로 null을 허용하지 않는 변수를 갖기 때문에 myLocationListener!!으로 작성
// 위치 측정 요청
if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) == true){
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
0, 0f, myLocationListener!!)
}
}
}
- 3. main activity onCreate 메서드
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// SplashScreen
installSplashScreen()
// 구글 지도 셋팅
MapsInitializer.initialize(this, MapsInitializer.Renderer.LATEST, null)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
activityMainBinding.run {
toolbarMain.run {
title = "LBSProject"
inflateMenu(R.menu.main_menu)
setOnMenuItemClickListener {
when(it?.itemId){
// 현재 위치 메뉴
R.id.main_menu_location ->{
// 현재 위치를 측정하고 지도를 갱신
getMyLocation()
}
}
false //false든 true든 개발자 입장에서 달라지는 것은 없음
}
}
}
// 권한을 확인한다.
requestPermissions(permissionList, 0) // 어떤 권한을 확인 받는 지 보기 위한 숫자 값
// 구글 지도를 보여주는 MapFragment 객체를 추출한다.
val supportMapFragment = supportFragmentManager.findFragmentById(R.id.map_fragment) as SupportMapFragment
// 구글 지도 사용 준비가 완료되면 반응하는 리스너를 등록한다.
supportMapFragment.getMapAsync {
// Toast.makeText(this, "구글 지도가 준비되었습니다", Toast.LENGTH_SHORT).show()
// 구글맵 객체를 변수에 담아준다.
mainGoogleMap = it
// 지도의 옵션을 설정한다.
it.uiSettings.isZoomControlsEnabled = true // 확대 축소 컨트롤
// 현재 위치를 표시한다.(현재위치를 구글 맵스에서 지원해주는 이 아이콘으로 할 것인가 아니면 마커로 표현할 것인가 결정)
it.isMyLocationEnabled = true // 파란 색 점이 나오고 어느 방향을 바라보고 있는 지 아이콘으로 표현
// 현재 위치를 표시하는 버튼을 없앤다.
it.uiSettings.isMyLocationButtonEnabled = false
// 맵타입
// it.mapType = GoogleMap.MAP_TYPE_NONE
// it.mapType = GoogleMap.MAP_TYPE_NORMAL // 기본 지도
// it.mapType = GoogleMap.MAP_TYPE_TERRAIN
// it.mapType = GoogleMap.MAP_TYPE_SATELLITE // 위성 지도
// it.mapType = GoogleMap.MAP_TYPE_HYBRID
// 위치 정보를 관리하는 객체를 가지고 온다.
val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
// 권한 확인(두 개의 권한에 대한 허용 여부 가져오기, 거부되면 PERMISSION_DENIED 값 가져옴 허용 되면 PERMISSION_GRANTED )
val a1 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_FINE_LOCATION)
val a2 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_COARSE_LOCATION)
// 두 권한에 대하여 허용 되어 있으면
if(a1 == PackageManager.PERMISSION_GRANTED && a2 == PackageManager.PERMISSION_GRANTED){
// 현재 저장되어 있는 위치 정보값을 가지고온다.
val location1 = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
val location2 = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
// 현재 위치를 표시한다.
if(location1 != null){
setMyLocation(location1)
} else if(location2 != null){
setMyLocation(location2)
}
// 현재 위치를 측정하여 지도 갱신
getMyLocation()
}
}
}
Splash
- icon 만드는 법 : file - new - image asset
- 1. build.gradle(app) depedencies에 작성 : implementation 'androidx.core:core-splashscreen:1.0.1'
- 2. themes 파일에 아래 코드 추가
<style name="AppTheme.Splash" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">@color/white</item>
<item name="windowSplashScreenAnimatedIcon">@mipmap/lbs_logo</item> // 로고 이미지
<item name="windowSplashScreenAnimationDuration">1000</item>
<!-- 프로젝트 이름에 따라 달라짐 -->
<item name="postSplashScreenTheme">@style/Theme.Mini01_LBS02</item>
</style>
- 3. manifest 파일 속 main activity의 activity 태그 속성으로 아래 코드 추가
android:theme="@style/AppTheme.Splash"
- 4. main activity 파일에 onCreate 메소드 안에 아래 코드 추가
installSplashScreen()
'Android' 카테고리의 다른 글
[Android] Material 3 Design (0) | 2023.07.24 |
---|---|
[Android] Google Maps 2 - 주변 지역 검색 (0) | 2023.07.20 |
[Android] 사진 저장 & Network (0) | 2023.07.18 |
[Android] Sensor & Location (0) | 2023.07.17 |
[Android] SQLiteDatabase 구조 및 데이터 보는 방법 (0) | 2023.07.07 |