NOW OR NEVER

[Android] Google Map API & Splash 본문

Android

[Android] Google Map API & Splash

LAURA 2023. 7. 19. 17:39
반응형

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

  •  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()
Comments