override fun onMapReady(naverMap: NaverMap) {
this.naverMap = naverMap
// 현 위치
naverMap.locationSource = locationSource
// 현 위치 버튼 기능
naverMap.uiSettings.isLocationButtonEnabled = true
// 위치를 추적하면서 카메라도 같이 움직임
naverMap.locationTrackingMode = LocationTrackingMode.Follow
Log.d("sooj", "onmapready")
// 줌
naverMap.maxZoom = 20.0 // (최대 21)
naverMap.minZoom = 5.0
// Firebase
val database = Firebase.database
val locationRef = database.getReference("user_location")
val userLocation = UserLocation(37.5665,126.9780) // 사용자 위도 경도
fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireContext())
if (ActivityCompat.checkSelfPermission(
requireContext(),
Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
requireContext(),
Manifest.permission.ACCESS_COARSE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
// TODO: Consider calling // 위치권한 없을 시
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return
}
fusedLocationClient.lastLocation.addOnSuccessListener { location: Location? ->
if (location != null) {
val lat = userLocation.latitude
val lng = userLocation.longitude
// 사용자 현재 위치 파베에 업로드
val userLocation =
location?.let {
UserLocation(latitude = location.latitude, longitude = it.longitude)
locationRef.child(userId).setValue(userLocation)
Log.d("sooj", "${UserLocation(latitude = location.latitude, longitude = it.longitude)}")
Log.d("sooj", "${locationRef.child(userId).setValue(userLocation)}")
setMark(marker, lat, lng, com.naver.maps.map.R.drawable.navermap_default_marker_icon_blue) // 마커
}
}
}
locationRef.setValue(userLocation) // userlocation 객체 파베 리얼타임에 저장
// locationRef.child(userId).addValueEventListener(object : ValueEventListener {
// override fun onDataChange(snapshot: DataSnapshot) {
// val userLocation = snapshot.getValue(UserLocation::class.java)
//
// if (userLocation != null) {
// val lat = userLocation.latitude
// val lng = userLocation.longitude
// setMark(marker, lat, lng, com.naver.maps.map.R.drawable.navermap_default_marker_icon_blue) // 마커
// }
// }
// override fun onCancelled(error: DatabaseError) {
// TODO("Not yet implemented")
// }
// })
}


locationRef.addValueEventListener(object : ValueEventListener{
override fun onDataChange(snapshot: DataSnapshot) {
for (snapshots in snapshot.children) {
val location = snapshots.getValue(UserLocation::class.java)
val userUid = currentUserId
if (userUid != null && userUid != currentUserId) // 마커 {
setMark(marker, com.naver.maps.map.R.drawable.navermap_default_marker_icon_blue)
}
}
override fun onCancelled(error: DatabaseError) {}
})
[오류]
FATAL EXCEPTION: main
Process: com.example.frompet, PID: 8965
kotlin.UninitializedPropertyAccessException: lateinit property fusedLocationClient has not been initialized
at com.example.frompet.ui.map.NaverMapFragment.onMapReady(NaverMapFragment.kt:149)
at com.naver.maps.map.e.d(SourceFile:143)
at com.naver.maps.map.MapView$4$1.run(SourceFile:198)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:294)
at android.app.ActivityThread.main(ActivityThread.java:8177)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireContext())
주석처리 해둬서 오류난거 ~
locationRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
for (snapshots in snapshot.children) {
val location = snapshots.getValue(UserLocation::class.java)
val userUid = snapshots.key // 사용자 uid
// 다른 사용자 위치 마커 표시
if (location != null && userUid != null && userUid != currentUserId) {
setMark(marker, location)
}
}
}
location 널처리 해줘야함 ~