https://developers.google.com/maps/documentation/android-sdk/current-place-tutorial?hl=ko
지도에서 현재 장소 선택 및 세부정보 표시하기 | Maps SDK for Android | Google Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 의견 보내기 지도에서 현재 장소 선택 및 세부정보 표시하기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저
developers.google.com
위 링크의 코드를 그대로 따라하면 현재 장소 근처의 건물 같은 것들을 표시해주는 것 같은데...
내 목적은 우선 현재 위치만 표시하는 거라 필요한 함수와 변수만 가져다 썼다.
접힌 글을 펴서 코드 전체를 볼 수 있다.
더보기
import android.Manifest
import android.annotation.SuppressLint
import android.content.Context
import android.content.pm.PackageManager
import android.location.Location
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.model.CameraPosition
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.MarkerOptions
import ----------------------------------.MainActivity
import ----------------------------------.databinding.FragmentMapBinding
class MapFragment : Fragment(), OnMapReadyCallback {
private var map: GoogleMap? = null
private var cameraPosition: CameraPosition? = null
private lateinit var fusedLocationProviderClient: FusedLocationProviderClient
lateinit var binding: FragmentMapBinding
lateinit var main: MainActivity
private val defaultLocation = LatLng(-33.8523341, 151.2106085)
private var locationPermissionGranted = false
private var lastKnownLocation: Location? = null
override fun onAttach(context: Context) {
super.onAttach(context)
main = context as MainActivity
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
binding = FragmentMapBinding.inflate(inflater, container, false)
if (savedInstanceState != null) {
lastKnownLocation = savedInstanceState.getParcelable(KEY_LOCATION)
cameraPosition = savedInstanceState.getParcelable(KEY_CAMERA_POSITION)
}
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(main)
binding.map.getMapAsync(this)
return binding.root
}
override fun onSaveInstanceState(outState: Bundle) {
map?.let { map ->
outState.putParcelable(KEY_CAMERA_POSITION, map.cameraPosition)
outState.putParcelable(KEY_LOCATION, lastKnownLocation)
}
super.onSaveInstanceState(outState)
}
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
getLocationPermission()
updateLocationUI()
getDeviceLocation()
}
@SuppressLint("MissingPermission")
private fun getDeviceLocation() {
/*
* Get the best and most recent location of the device, which may be null in rare
* cases when a location is not available.
*/
try {
if (locationPermissionGranted) {
val locationResult = fusedLocationProviderClient.lastLocation
locationResult.addOnCompleteListener(main) { task ->
if (task.isSuccessful) {
// Set the map's camera position to the current location of the device.
lastKnownLocation = task.result
if (lastKnownLocation != null) {
map?.moveCamera(CameraUpdateFactory.newLatLngZoom(
LatLng(lastKnownLocation!!.latitude,
lastKnownLocation!!.longitude), 10.0f))
}
} else {
map?.moveCamera(CameraUpdateFactory
.newLatLngZoom(defaultLocation, 10.0f))
map?.uiSettings?.isMyLocationButtonEnabled = false
}
}
}
} catch (e: SecurityException) {
Log.e("Exception: %s", e.message, e)
}
}
private fun getLocationPermission() {
/*
* Request location permission, so that we can get the location of the
* device. The result of the permission request is handled by a callback,
* onRequestPermissionsResult.
*/
if (ContextCompat.checkSelfPermission(main.applicationContext,
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
locationPermissionGranted = true
} else {
ActivityCompat.requestPermissions(main, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION)
}
}
@SuppressLint("MissingPermission")
private fun updateLocationUI() {
if (map == null) {
return
}
try {
if (locationPermissionGranted) {
map?.isMyLocationEnabled = true
map?.uiSettings?.isMyLocationButtonEnabled = true
} else {
map?.isMyLocationEnabled = false
map?.uiSettings?.isMyLocationButtonEnabled = false
lastKnownLocation = null
getLocationPermission()
}
} catch (e: SecurityException) {
Log.e("Exception: %s", e.message, e)
}
}
companion object{
private const val PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1
private const val KEY_CAMERA_POSITION = "camera_position"
private const val KEY_LOCATION = "location"
}
override fun onStart() {
super.onStart()
binding.map.onStart()
}
override fun onStop() {
super.onStop()
binding.map.onStop()
}
override fun onResume() {
super.onResume()
binding.map.onResume()
}
override fun onPause() {
super.onPause()
binding.map.onPause()
}
override fun onLowMemory() {
super.onLowMemory()
binding.map.onLowMemory()
}
override fun onDestroy() {
super.onDestroy()
binding.map.onDestroy()
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
if(binding.map != null){
binding.map.onCreate(savedInstanceState)
}
}
}
'졸업프로젝트' 카테고리의 다른 글
서버에서 안드로이드로 이미지 불러올 때 참고 블로그 (0) | 2023.02.06 |
---|---|
안드로이드 코틀린 Multipart / form data 참고 사이트 (0) | 2023.02.01 |
안드로이드 스튜디오 구글맵 불러오기 참고 블로그 (0) | 2023.01.21 |
.. files found with path 'META-INF/~~~~' from inputs: (0) | 2023.01.21 |
안드로이드 - 네비게이션 메뉴 처음 선택되어 보여지는 메뉴 설정 (0) | 2023.01.13 |