ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android Google Map 구현하기
    Android/LBS 2019. 7. 26. 17:56

    휴대폰에서 주소를 표기할때 그냥 "서울시 동대문구 OOO" 이런식으로 표시하면 근처 거주나 지역을 알고 있는 사람외에는 쉽게 알기 어려워 따로 지도앱을 키고는 한다.

     

    PC에서의 경우에는 워낙 화면이 넓어 이동이 자유롭지만 태블릿이 아닌이상 휴대폰에서는 고것이 참...

    그래서 문자보다는 이미지가 좋은 만큼 지도를 보여주기 위해 Google Map을 사용해보도록 하겠다.


    Gradle Dependency

     

    implementation 'com.google.android.gms:play-services:12.0.1'


    1. API Key 흭득하기

     

    Site : https://dundun-dev.tistory.com/25


    2. AndroidManifest.xml 파일 준비

    <permission android:name="kr.co.s1.myapplication.permission.MAPS_RECEIVE"
    android:protectionLevel="signature"/>
    
    <uses-permission android:name="kr.co.s1.myapplication.permission.MPAS_RECEIVE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name=" com.google.android.providers.gsf.permission.READ_GSERVICES"/>

    kr.co.s1.myapplication 이부분은 본인 패키지 명에 맞추어 작성해준다.

            <meta-data
                    android:name="com.google.android.gms.version"
                    android:value="@integer/google_play_services_version"/>
    
            <meta-data android:name="com.google.android.maps.v2.API_KEY"
                       android:value="AIz________________________E"/>
    

    play-services 라이브러리의 버전을 등록하고 아까 Google에서 받은 Map Key를 넣어준다.


    3. Layout.xml 파일 준비

    <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
        <fragment
                android:id="@+id/map_view"
                android:name="com.google.android.gms.maps.SupportMapFragment"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"/>
    </LinearLayout>
    

    4. 간단하게 지도 출력여부 확인하기

    class MainActivity : AppCompatActivity(), OnMapReadyCallback {
    
        lateinit var map: GoogleMap
    
        @RequiresApi(Build.VERSION_CODES.P)
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            TedPermission.with(this)
                .setPermissionListener(permissionListener)
                .setRationaleConfirmText("권한 필요")
                .setDeniedMessage("권한 거절")
                .setPermissions(Manifest.permission.ACCESS_FINE_LOCATION)
                .check()
    
            (map_view as SupportMapFragment).getMapAsync(this)
        }
    
        private val permissionListener = object : PermissionListener {
            override fun onPermissionGranted() {
                Toast.makeText(this@MainActivity, "권한 허가", Toast.LENGTH_SHORT).show()
            }
    
            override fun onPermissionDenied(deniedPermissions: ArrayList<String>?) {
                Toast.makeText(this@MainActivity, "권한 거부", Toast.LENGTH_SHORT).show()
            }
        }
    
        override fun onMapReady(googleMap: GoogleMap?) {
            if (googleMap != null) {
                map = googleMap
            }
        }
    
    }

    OnMapReadyCallback 인터페이스의 onMapReady를 구현해주고 맵을 출력할 준비가 되면 ( API 인증 과정 )

    맵을 출력해주면 된다.


    5. 지도의 중심 위치 이동하기

        override fun onMapReady(googleMap: GoogleMap?) {
            if (googleMap != null) {
                map = googleMap
    
                // CameraSetting
                val latLng = LatLng(37.550227,126.987006)
                val position = CameraPosition.builder().target(latLng).zoom(14f).build()
                map.moveCamera(CameraUpdateFactory.newCameraPosition(position))
            }
        }

    지도를 막상 보았을때 위치가 현재 우리가 살고 있는 위치가 아님으로 지도를 보고 있는 카메라를 옮긴다는 개념으로

    CameraPosition 클래스를 사용하여 객체를 생성후 moveCamera로 이동시켜주면 된다.

     

    서울 좌표 : 37.550227 | 126.987006


    6. GoogleMap 이벤트 정의

        override fun onMapReady(googleMap: GoogleMap?) {
            if (googleMap != null) {
                map = googleMap
    
                // CameraSetting
                val latLng = LatLng(37.550227,126.987006)
                val position = CameraPosition.builder().target(latLng).zoom(14f).build()
                map.moveCamera(CameraUpdateFactory.newCameraPosition(position))
    
                // Listener
                map.setOnCameraMoveListener {
                    "${map.cameraPosition.target.latitude} : ${map.cameraPosition.target.longitude}".log()
                }
            }
        }

    OnCameraMoveListener : 카메라의 위치가 변경될때 발생

    OnCameraIdleListener : 지도의 중심 위치, 확대 수준 변경이 완료된 순간

    OnMapClickListener : 지도의 특정 위치를 클릭

    OnMapLongClickListener : 지도의 특정 위치를 오랫동안 클릭

    댓글

Designed by Tistory.