본문 바로가기

안드로이드/androidstudio

[Android] NaverMap api 기기 방향 탐지

 안녕하세요. 이번 포스팅에서는 Naver map api에서 기기의 방향에 맞춰 지도 북쪽이 따라가도록 해보겠습니다.

Naver Map api 사용법은 홈페이지 및 블로그에 많이 나와있지만 사용자의 방향을 따라가는건 안나와있어서 한번 만들어보았습니다.

 필요 개념: Sensor, naver map

 먼저 코드 보시겠습니다.

최초 onCreate 부분에서 혹은 onStart 등 view 생성전,중에 아래와 같이 sensor와 sensorManger를 만들어줍니다.

sensorManager = requireActivity().getSystemService(Context.SENSOR_SERVICE) as SensorManager
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION)

 sensorManager는 우리가 사용할 센서를 가지고있다가 등록 및 해제 시킬때 사용할겁니다.

sensor는 기기의 어떤 sensor를 쓸것인지 저장하는 부분이며 기기 방향을 인식할때는 TYPE_ORIENTATION을 사용합니다. 이후 특정 버튼이나 상황의 이벤트에 아래 코드를 통해 map View에 붙여줄겁니다.

private lateinit var sensorManager: SensorManager
private lateinit var sensor : Sensor
private var sensorEvent : SensorEventListener = object :SensorEventListener{
    override fun onSensorChanged(event: SensorEvent?) {}
    override fun onAccuracyChanged(p0: Sensor?, p1: Int) {}
}
fun setRotateToMap(){
    if(isNaver){
        (mapView as NaverMap).apply {
            sensorEvent = object :SensorEventListener{
                override fun onSensorChanged(event: SensorEvent?) {
                    if (event?.sensor?.type == Sensor.TYPE_ORIENTATION) {
                        moveCamera(
                            CameraUpdate.withParams((CameraUpdateParams()).rotateTo(event.values[0].toDouble()))
                                .animate(CameraAnimation.Easing)
                                .reason(-2)
                        )
                    }
                }
                override fun onAccuracyChanged(p0: Sensor?, p1: Int) {}
            }
            sensorManager.registerListener(sensorEvent, sensor, SensorManager.SENSOR_DELAY_UI)
        }
    }
}
fun unRegisterRotateToMap(){
    sensorManager.unregisterListener(sensorEvent)
}

 sensorEvent를 통해 저희가 지정한 sensor 변수의 이벤트와 동일할 이벤트를 가져옵니다.

 if (event?.sensor?.type == Sensor.TYPE_ORIENTATION)

 만약 다른 센서들도 사용한다면 Sensor.(해당 센서) 로 하시면 됩니다.

 이후 지도의 카메라를 각도에 따라 reotateTo를 통해 회전하도록 합니다.

moveCamera(
          CameraUpdate.withParams((CameraUpdateParams()).rotateTo(event.values[0].toDouble()))
          .animate(CameraAnimation.Easing)
          .reason(-2) 
     	  )

 여기서 만약 3차원도 움직이고 싶다면 tiltTo를 사용하시면 됩니다.

 방위 값은 event.value[0] 이며 z축의 회전 값은 event.value[1] 에 값을 조금 조정하여 사용하시면 기기의 방향에 따라 지도도 같이 회전하여 휴대폰 방향에 맞춰집니다.