ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] Google Map API 사용하기 (+ SHA 인증서 지문 얻기)
    안드로이드 2024. 4. 30. 18:18

    ✏️ TIL(Today I Learned)

    Google Map API를 사용하여 현재 사용자의 위치를 구글 지도로 표시하는 앱을 만들어봤다.

    위치 권한을 허용한 뒤, 애뮬레이터의 Location을 이동하면 해당 장소의 지도가 보이게 된다.

     

    구글 API를 사용하려면, GoogleCloud에서 사용자 인증키 만들어야한다.

    구글 계정으로 가입을 하면, 아래와 같이 자동으로 My First Project가 생성된다.

    maps를 검색하여 Google Maps Platform을 클릭한 뒤, 사용자 인증 정보로 들어간다.

    사용자 인증 정보 만들기를 클릭하여, API 키를 생성하면 된다.

     

     

    패키지 명과 SHA-1을 입력하면 아래와 같이 API 키가 생성된다.

    SHA 인증서는 터미널에서 아래 명령어를 입릭하면 얻을 수 있다.

    ./gradlew app:signingReport

     

    키 표시를 클릭하여, API 키를 복사한다.

     

     

    그 다음, AndroidManifest.xml에서 permission과 google-map api 추가한다.

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
        
        <!--Google Maps 사용을 위한 위치 permission-->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
        <uses-permission android:name="android.permission.INTERNET"/>
    
        <application
            <!--생략-->
            tools:targetApi="31">
    
            <uses-library android:name="org.apache.http.legacy" android:required="true"/>
            <meta-data android:name="com.google.android.maps.v2.API_KEY"
                android:value="@string/api_key"/> <!--value의 "" 안에 복사한 키 붙여넣기-->
            <meta-data android:name="com.google.android.gms.version"
                android:value="@integer/google_play_services_version"/>
    
            <activity
                android:name=".MainActivity"
                <!--생략-->
            </activity>
        </application>
    
    </manifest>

     

     

    build.gradle(:app)에 아래와 같이 Googlemap library 추가한다.

    dependencies {
    
        //생략
    
        //google
        implementation ("com.google.android.gms:play-services-maps:18.1.0")
        implementation ("com.google.android.gms:play-services-location:21.0.1")
    }

     

     

    activity_main.xml은 간단하게 구성했다.

    <?xml version="1.0" encoding="utf-8"?>
    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.google.android.gms.maps.SupportMapFragment"/>

     

     

    MainActivity.kt 이다.

    launch를 통해 사용자 위치 권한을 받는다.

    updateLocation() 으로 사용자의 실시간 위치를 받아오고, setLastLocation()으로 그 위치를 지도에 마커로 표시한다.

    class MainActivity : AppCompatActivity(), OnMapReadyCallback {
        private lateinit var mGoogleMap: GoogleMap
        private lateinit var fusedLocationClient: FusedLocationProviderClient //위치 서비스가 gps를 사용해서 위치를 확인
        private lateinit var locationCallback: LocationCallback //위치 값 요청에 대한 갱신 정보를 받는 변수
        private lateinit var locationPermission: ActivityResultLauncher<Array<String>>
        
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            locationPermission = registerForActivityResult(
                ActivityResultContracts.RequestMultiplePermissions()){ results ->
                if(results.all{it.value}){
                    (supportFragmentManager.findFragmentById(R.id.mapView) as SupportMapFragment)!!.getMapAsync(this)
                }else{ //문제가 발생했을 때
                    Toast.makeText(this,"권한 승인이 필요합니다.",Toast.LENGTH_LONG).show()
                }
            }
    
            //권한 요청
            locationPermission.launch(
                arrayOf(
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION
                )
            )
        }
    
        // 지도 객체를 이용할 수 있는 상황이 될 때
        override fun onMapReady(p0: GoogleMap) {
            val seoul = LatLng(37.566610, 126.978403)
            mGoogleMap = p0
            mGoogleMap.mapType = GoogleMap.MAP_TYPE_NORMAL // default 노말 생략 가능
            mGoogleMap.apply {
                val markerOptions = MarkerOptions()
                markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
                markerOptions.position(seoul)
                markerOptions.title("서울 시청")
                markerOptions.snippet("Tel:01-120")
                addMarker(markerOptions)
            }
    
            fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
            updateLocation()
        }
    
        private fun updateLocation(){
            val locationRequest = LocationRequest.create().apply {
                interval = 1000
                fastestInterval = 500
                priority = LocationRequest.PRIORITY_HIGH_ACCURACY
            }
    
            locationCallback = object : LocationCallback(){
                //1초에 한번씩 변경된 위치 정보가 onLocationResult 으로 전달된다.
                override fun onLocationResult(locationResult: LocationResult) {
                    locationResult?.let{
                        for (location in it.locations){
                            Log.d("위치 정보",  "위도: ${location.latitude} 경도: ${location.longitude}")
                            setLastLocation(location) //계속 실시간으로 위치를 받아오고 있기 때문에 맵을 확대해도 다시 줄어든다.
                        }
                    }
                }
            }
            //권한 처리
            if (ActivityCompat.checkSelfPermission(
                    this,
                    Manifest.permission.ACCESS_FINE_LOCATION
                ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
                    this,
                    Manifest.permission.ACCESS_COARSE_LOCATION
                ) != PackageManager.PERMISSION_GRANTED
            ) {
                return
            }
    
            fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback,
                Looper.myLooper()!!
            )
        }
    
        fun setLastLocation(lastLocation: Location){
            val LATLNG = LatLng(lastLocation.latitude,lastLocation.longitude)
            val makerOptions = MarkerOptions().position(LATLNG).title("현재 위치")
            val cameraPosition = CameraPosition.Builder().target(LATLNG).zoom(15.0f).build()
    
            mGoogleMap.addMarker(makerOptions)
            mGoogleMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
        }
    }
Designed by Tistory.