๐ ๊ตฌ๊ธ ํ๋ ์ด ์๋น์ค์ Google Maps API๋ฅผ ์ฌ์ฉํ๋ฉด ๊ตฌ๊ธ ์ง๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฑ์ ์ง๋๋ฅผ ์ถ๊ฐํ ์ ์์
- ๊ตฌ๊ธ ์ง๋๋ Google Maps Platform ์๋น์ค ์ค์ ํ๋์ด๋ฉฐ, ๊ตํต์ ๋ณด ๊ธฐ๋ฐ์ ๊ฒฝ๋ก ์ฐพ๊ธฐ์ ์ฅ์ ์ ๋ณด, ๊ฒ์ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณต.
- ๊ตญ๋ด์์๋ ๊ตฌ๊ธ ์ง๋์ ๊ฒฝ๋ก์ฐพ๊ธฐ ๋ฉ๋ด์ค ๋ฒ์ค๋ง ์ฌ์ฉํ ์ ์์.
1. ๊ตฌ๊ธ ์ง๋ ์์ํ๊ธฐ
์๋๋ก์ด๋ ์คํ๋์ค๋ ๊ตฌ๊ธ ์ง๋๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ก์ ํธ ์์ฑ ์ ํ๋ก์ ํธ์ ์ข ๋ฅ๋ฅผ ์ ํํ๋ ๋ฉ๋ด์์ Google Maps Activity๋ฅผ ์ ๊ณต
โก๏ธ MainActivity ๋์ MapsActivity๊ฐ ์์ฑ๋จ
Google Maps API ํค ์ค์
๊ตฌ๊ธ ์ง๋๋ฅผ ํฌํจํ ๊ตฌ๊ธ ํ๋ ์ด ์๋น์ค์ ์์ธ์คํ๋ ค๋ฉด ๊ตฌ๊ธ ํ๋ ์ด ์๋น์ค์ API ํค๊ฐ ํ์
์ด์ ์๋ google_maps_api.xml ํ์ผ์ด ์๋ ์์ฑ๋๊ณ , ํด๋น ํ์ผ์ APIํค๋ฅผ ์
๋ ฅํ์ผ๋, ๋ฒ๋ธ๋น์ ์นฉ๋ฉํฌ ๋ฒ์ ๋ถํฐ๋ AndroidManifest.xml์ APIํค๋ฅผ ์
๋ ฅํ๋๋ก ๋ณ๊ฒฝ์ด ๋จ
<!--
TODO: Before you run your application, you need a Google Maps API key.
To get one, follow the directions here:
https://developers.google.com/maps/documentation/android-sdk/get-api-key
Once you have your API key (it starts with "AIza"), define a new property in your
project's local.properties file (e.g. MAPS_API_KEY=Aiza...), and replace the
"YOUR_API_KEY" string in this file with "${MAPS_API_KEY}".
-->
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="YOUR_API_KEY" />
ํค๋ฅผ ์ ๋ ฅ ํ์ ์๋๋ก์ด๋ ์คํ๋์ค์์ ์ฑ์ ๋น๋ํ๊ณ ์์ํ๋ฉด, ์๋๋์ ๋ง์ปค๊ฐ ํ์๋ ์ง๋๋ฅผ ํ์
๐ ์ง๋๊ฐ ์ ๋จ๋ฉด ๊ตฌ๊ธ cloud ์ ์ ํ์ฌ API key ์์ ์์ ํจํค์ง๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋จ ! โถ๏ธ ํจํค์ง๋ช ์ ๋ฌด์กฐ๊ฑด ์๋ฌธ์ !!
2. ๊ตฌ๊ธ ์ง๋ ์ฝ๋ ์ดํด๋ณด๊ธฐ
activity_maps.xml์ SupportMapFragment
ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ฉด activity_maps.xml ํ์ผ์ด ์๋ ์์ฑ๋จ. ์ฝ๋๋ฅผ ๋ณด๋ฉด android:name์ "com.google.android.gms.maps.SupportMapFragment"๊ฐ ์ค์ ๋์ด ์์.
Google Maps API๋ SupportMapFragment์ ๊ตฌ๊ธ ์ง๋๋ฅผ ํ์.
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MapsActivity" />
MapsActivity.kt์ SupportMapFragment.getMapAsync
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMapsBinding.inflate(layoutInflater)
setContentView(binding.root)
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
}
MapsActivity.kt ํ์ผ์ ์ด๋ฉด onCreate() ๋ฉ์๋ ๋ธ๋ก ์์์๋ supportFragmentManager์ findFragmentById() ๋ฉ์๋๋ก id๊ฐ map์ธ SupportMapFragment๋ฅผ ์ฐพ์ ํ getMapAsync()๋ฅผ ํธ์ถํด์ ์๋๋ก์ด๋์ ๊ตฌ๊ธ ์ง๋๋ฅผ ๊ทธ๋ ค๋ฌ๋ผ๋ ์์ฒญ์ ํจ.
MapsActivity.kt์ OnMapReadyCallback
class MapsActivity : AppCompatActivity(), OnMapReadyCallback { }
์๋๋ก์ด๋๋ ๊ตฌ๊ธ ์ง๋๊ฐ ์ค๋น๋๋ฉด OnMapReadyCallback ์ธํฐํ์ด์ค์ onMapReady() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด์ ํ๋ผ๋ฏธํฐ๋ก ์ค๋น๋ GoogleMap์ ์ ๋ฌํด ์ค.
override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
// Add a marker in Sydney and move the camera
val sydney = LatLng(-34.0, 151.0)
mMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
}
๋ฉ์๋ ์์์ ๋ฏธ๋ฆฌ ์ ์ธ๋ mMap ํ๋กํผํฐ์ GoogleMap์ ์ ์ฅํด๋๋ฉด ์กํฐ๋นํฐ ์ ์ฒด์์ ๋งต์ ์ฌ์ฉํ ์ ์์.
๊ตฌ๊ธ์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ์๋๋์ ์ขํ ์ฝ๋๊ฐ ์์.
* API Level 12 ์ดํ ๋ฒ์ ์์์ ํธํ์ฑ์ด ํ์์๋ค๋ฉด SupportMapFragment ๋์ MapFragment๋ฅผ ์ฌ์ฉํ ์ ์์.
* ์ค๋งํธํฐ์ ๊ตฌ๊ธ ํ๋ ์ด ์๋น์ค๊ฐ ์ค์น๋์ด ์์ง ์์ผ๋ฉด ์ฌ์ฉ์๊ฐ ๊ตฌ๊ธ ํ๋ ์ด ์๋น์ค๋ฅผ ์ค์นํ ๋๊น์ง onMapReady() ๋ฉ์๋๊ฐ ํธ์ถ๋์ง ์์.
3. ์นด๋ฉ๋ผ์ ์ง๋ ๋ทฐ
๊ตฌ๊ธ ์ง๋์์๋ ์นด๋ฉ๋ผ๋ฅผ ํตํด ํ์ฌ ํ๋ฉด์ ์ง๋ ๋ทฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์์.
โ ์ง๋ ๋ทฐ๋ ํ๋ฉด์์ ์๋๋ฅผ ๋ด๋ ค๋ค ๋ณด๋ฉด์ ๋ชจ๋ธ๋ง ๋๋ฉฐ ์นด๋ฉ๋ผ์ ํฌ์ง์
์ ์๋/๊ฒฝ๋, ๋ฐฉ์, ๊ธฐ์ธ๊ธฐ ๋ฐ ํ๋/์ถ์ ์์ฑ์ผ๋ก ์ง์
โ ์นด๋ฉ๋ผ์ ์์น๋ CameraPosition ํด๋์ค์ ๊ฐ์ข
์ต์
์ ์ฌ์ฉํด์ ์กฐ์ ํ ์ ์์
CameraPosition.Builder().์ต์
1.์ต์
2.build()
Target
โ ์นด๋ฉ๋ผ์ ๋ชฉํ ์ง์ Target์ ์ง๋ ์ค์ฌ์ ์์น์ด๋ฉฐ ์๋ ๋ฐ ๊ฒฝ๋ ์ขํ๋ก ์ง์
CameraPosition.Builder().target(LatLng(-34.0, 151.0))
Zoom
โ ์นด๋ฉ๋ผ์ ์ค Zoom (ํ๋/์ถ์) ๋ ๋ฒจ์ ๋ฐ๋ผ ์ง๋์ ๋ฐฐ์จ์ด ๊ฒฐ์ . ์ค ๋ ๋ฒจ์ด ๋์ ์๋ก ๋ ์์ธํ ์ง๋๋ฅผ ๋ณผ ์ ์๋ ๋ฐ๋ฉด, ์ค ๋ ๋ฒจ์ด ์์์๋ก ๋ ๋์ ์ง๋๋ฅผ ๋ณผ ์ ์์.
CameraPosition.Builder().zoom(15.5f)
๐ ์ค ๋ ๋ฒจ์ด 0์ธ ์ง๋์ ๋ฐฐ์จ์ ์ ์ธ๊ณ์ ๋๋น๊ฐ ์ฝ 256dp๊ฐ ๋๋ฉฐ ๋ ๋ฒจ์ ๋ฒ์๋ ๋ค์๊ณผ ๊ฐ์
๋ ๋ฒจ | ์ค๋ช |
1.0 | ์ธ๊ณ |
5.0 | ๋๋ฅ |
10.0 | ๋์ |
15.0 | ๊ฑฐ๋ฆฌ |
20.0 | ๊ฑด๋ฌผ |
Bearing
โ ์นด๋ฉ๋ผ์ ๋ฒ ์ด๋ง Bearing์ ์ง๋์ ์์ง์ ์ด ๋ถ์ชฝ์ ๊ธฐ์ค์ผ๋ก ์๊ณ ๋ฐฉํฅ ๋จ์๋ก ์ธก์ ๋๋ ๋ฐฉํฅ.
CameraPosition.Builder().bearing(300f)
Tilt
โ ์นด๋ฉ๋ผ์ ๊ธฐ์ธ๊ธฐ Tilt๋ ์ง๋์ ์ค์ ์์น์ ์ง๊ตฌ ํ๋ฉด ์ฌ์ด์ ์ํธ์์ ์นด๋ฉ๋ผ ์์น๋ฅผ ์ง์
โ ๊ธฐ์ธ๊ธฐ๋ก ์์ผ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋ฆฌ ๋จ์ด์ง ์งํ์ด ๋ ์๊ฒ ๋ํ๋๊ณ ์ฃผ๋ณ ์งํ์ด ๋ ์ผ์ ธ ๋งต์ด ์๊ทผ์ผ๋ก ๋ํ๋จ
CameraPosition.Builder().tilt(50f)
4. ์์ค ์ฝ๋์์ ์นด๋ฉ๋ผ ์ด๋ํ๊ธฐ
์ต์
์ ์ด์ฉํด์ CameraPosition ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ moveCamera() ๋ฉ์๋๋ก ์นด๋ฉ๋ผ์ ์์น๋ฅผ ์ด๋์์ผ ์ง๋์ ๋ณ๊ฒฝํ ์ ์์.
โก๏ธ MapsActivity.kt ํ์ผ์ onMapReady() ๋ฉ์๋ ์์ ์์ฑ.
CameraPosition.Builder ๊ฐ์ฒด๋ก ์นด๋ฉ๋ผ ํฌ์ง์ ์ ์ค์
๐ build() ๋ฉ์๋๋ฅผ ํธ์ถํด์ CameraPosition ๊ฐ์ฒด๋ฅผ ์์ฑ
val cameraPosition = CameraPosition.Builder()
.target(LATLNG)
.zoom(15.0f)
.build()
CameraUpdateFactory.newCameraPosition() ๋ฉ์๋์ CameraPosition ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ฉด ์นด๋ฉ๋ผ ํฌ์ง์ ์ ์ง๋์์ ์ฌ์ฉํ ์ ์๋ ์นด๋ฉ๋ผ ์ ๋ณด๊ฐ ์์ฑ
val cameraUpdate =
CameraUpdateFactory.newCameraPosition(cameraPosition)
๋ณ๊ฒฝ๋ ์นด๋ฉ๋ผ ์ ๋ณด๋ฅผ GoogleMap์ () ๋ฉ์๋์ ์ ๋ฌํ๋ฉด ์นด๋ฉ๋ผ ํฌ์ง์ ์๊ธฐ์ค์ผ๋ก ์ง๋์ ์์น, ๋ฐฐ์จ, ๊ธฐ์ธ๊ธฐ ๋ฑ์ด ๋ณ๊ฒฝ๋์ด ํ์
mMap.moveCamera(cameraUpdate)
5. ๋ง์ปค
๋ง์ปค Marker๋ ์ง๋์ ์์น๋ฅผ ํ์. ์์ด์ฝ์ ์์, ์ด๋ฏธ์ง, ์์น๋ฅผ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ ๋ํ์์ผ๋ก ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์ ๋ง์ปค๋ฅผ ํด๋ฆญํ๋ฉด ์ ๋ณด์ฐฝ์ ๋์ฐ๊ฑฐ๋ ํด๋ฆญ๋ฆฌ์ค๋์ฒ๋ผ ํด๋ฆญ์ ๋ํ ์ฝ๋ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์.
๋ง์ปค ํ์ํ๊ธฐ
1. mMap = googleMap ์ฝ๋ ์๋์ ํน์ ์ฅ์์ ์๋์ ๊ฒฝ๋ ์ขํ๊ฐ์ผ๋ก LatLng ๊ฐ์ฒด๋ฅผ ์์ฑ
val LATLNG = LatLng(35.8715, 128.6017)
2. ๋ง์ปค๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๋ง์ปค์ ์ต์ ์ ์ ์ํ MarkerOptions ๊ฐ์ฒด๊ฐ ํ์.
MarkerOptions ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋จธ์ปค์ ์ขํ์ ์ ๋ชฉ์ ์ค์ .
val markerOptions = MarkerOptions()
.position(LATLNG)
.title("Marker")
3. GoogleMap ๊ฐ์ฒด์ addMarker() ๋ฉ์๋์ MarkerOptions๋ฅผ ์ ๋ฌํ๋ฉด ๊ตฌ๊ธ ์ง๋์ ๋ง์ปค๊ฐ ์ถ๊ฐ.
mMap.addMarker(markerOptions)
4. ์นด๋ฉ๋ผ๋ฅผ ๋ง์ปค์ ์ขํ๋ก ์ด๋ํ๊ณ ์ค์ ๊ฑฐ๋ฆฌ ๋ ๋ฒจ๋ก ํ๋
val cameraPosition = CameraPosition.Builder()
.target(LATLNG)
.zoom(15.0f)
.build()
val cameraUpdate =
CameraUpdateFactory.newCameraPosition(cameraPosition)
mMap.moveCamera(cameraUpdate)
5. MarkerOptions ๊ฐ์ฒด์ title(), snippet() ๋ฉ์๋๋ก ์ ๋ณด ์ฐฝ์ ์์ ํ ์ ์์ผ๋ฉฐ ๋ง์ปค๋ฅผ ํด๋ฆญํ๋ฉด ์ ๋ณด์ฐฝ์ด ํ์
val markerOptions = MarkerOptions()
.position(LATLNG)
.title("Daegu City Hall")
.snippet("35.8715, 128.6017")
๋ง์ปค ์์ด์ฝ ๋ณ๊ฒฝํ๊ธฐ
๋ง์ปค ์์ด์ฝ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ์์ด์ฝ๋ฟ๋ง ์๋๋ผ ๋นํธ๋งต ์ด๋ฏธ์ง๋ก ๋ณ๊ฒฝํ ์ ์์.
PNG ์ด๋ฏธ์ง ํ์ผ์ ํ๋ก์ ํธ์ ์ถ๊ฐํ๊ณ ๋นํธ๋งต์ผ๋ก ๋ณํํด์ ์์ด์ฝ์ผ๋ก ๋ณ๊ฒฝ.
1. drawable ๋๋ ํ ๋ฆฌ์ ๋ง์ปค ์์ด์ฝ์ผ๋ก ์ ์ฉํ PNG ์ด๋ฏธ์ง ํ์ผ์ ์ถ๊ฐ
2. onMapReady() ์์ ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐ
val bitmapDrawable: BitmapDrawable
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
bitmapDrawable = getDrawable(R.drawable.marker) as BitmapDrawable
} else {
bitmapDrawable = resources.getDrawable(R.drawable.marker) as BitmapDrawable
}
3. BitmapDescriptorFactory.fromBitmap() ๋ฉ์๋์ BitmapDrawable์ ๋นํธ๋งต ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ ๋ง์ปค ์์ด์ฝ์ ์ํ
BitmapDescriptor ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ import
var discriptor =
BitmapDescriptorFactory.fromBitmap(bitmapDrawable.bitmap)
4. MarkerOptions ๊ฐ์ฒด์ icon() ๋ฉ์๋๋ฅผ ํธ์ถํด์ BitmapDescriptor ๊ฐ์ฒด์ ์์ด์ฝ์ ๋ง์ปค์ ์ ์ฉํ๋๋ก ์์
val markerOptions = MarkerOptions()
.position(LATLNG)
.icon(discriptor)
mMap.addMarker(markerOptions)
* ์์ด์ฝ์ ํฌ๊ธฐ๊ฐ ํด ๊ฒฝ์ฐ Bitmap.createScaledBitmap() ๋ฉ์๋๋ฅผ ํธ์ถํด์ ํฌ๊ธฐ๋ฅผ ์ค์ธ ๋นํธ๋งต ๊ฐ์ฒด๋ฅผ ๋ฐํ๋ฐ์์ผ ํจ
6. ํ์ฌ ์์น ๊ฒ์ํ๊ธฐ
์ค๋งํธํฐ์ฒ๋ผ ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์๋ ์ฌ์ฉ์๊ฐ ์์น๋ฅผ ์ด๋ํ๊ณ ๊ทธ ์์น๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ๋ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์์.
โ ์ฑ์์ ์ค๋งํธํฐ์ ํ์ฌ ์์น๋ฅผ ๊ฒ์ํ๋ ค๋ฉด ์์น ๊ถํ์ด ํ์
โ ์๋๋ก์ด๋ ํ๋ซํผ์ ํ์ฌ ์์น๋ฅผ ๊ฒ์ํ๋ FusedLocationProviderClinet API๋ฅผ ์ ๊ณต
โก๏ธ FusedLocationProviderClinet API๋ GPS Global Positioning System ์ ํธ ๋ฐ ์์ดํ์ด์ ํต์ ์ฌ ๋คํธ์ํฌ ์์น๋ฅผ ๊ฒฐํฉํด์ ์ต์ํ์ ๋ฐฐํฐ๋ฆฌ ์ฌ์ฉ๋์ผ๋ก ๋น ๋ฅด๊ณ ์ ํํ๊ฒ ์์น๋ฅผ ๊ฒ์
Google Play Service ์์กด์ฑ ์ถ๊ฐํ๊ธฐ
FusedLocationProviderClinet API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ build.gradle ํ์ผ์ ๊ตฌ๊ธ ํ๋ ์ด ์๋น์ค์ Loacation ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ์ ์ถ๊ฐ. Location ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Maps ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์ ์ด ๊ฐ์์ผ ํจ. Location ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์์ง๋๋ก Maps์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ์ ๋ง์ถฐ์ค.
implementation 'com.google.android.gms:play-services-location:18.2.0'
implementation 'com.google.android.gms:play-services-maps:18.2.0'
๊ถํ์ ๋ช ์ธํ๊ณ ์์ฒญ/ ์ฒ๋ฆฌํ๊ธฐ
์ค๋งํธํฐ์ ์์น ๊ธฐ๋ฅ์ ์ ๊ทผํ๊ธฐ ์ํด AndroidManifest.xml ํ์ผ์ ์์น ๊ถํ์ ์ ์ธ. ์์น ๊ถํ์ ๋ ๊ฐ์ง๊ฐ ์์ผ๋ฉฐ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์.
<!-- ๋์ ๋ธ๋ก ๋ด์์ ์ ํํ ์์น (๋คํธ์ํฌ ์์น) -->
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- ์ ํํ ์์น ํ๋ณด (๋คํธ์ํฌ ์์น + GPS ์์น) -->
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"/>
MapsActivity์ OnMapReadyCallback ์ธํฐํ์ด์ค๋ฅผ ์์ ๋ฐ์.
class MapsActivity : AppCompatActivity(), OnMapReadyCallback {}
๊ถํ ์ฒ๋ฆฌ๋ฅผ ์ํด์ onCreate() ๋ฉ์๋ ์์ ๋ฐ์ฒ๋ฅผ ์ ์ธ. ์ฌ๊ธฐ์๋ ํ ๋ฒ์ 2๊ฐ์ ๊ถํ์ ๋ํ ์น์ธ์ ์์ฒญํ๊ธฐ ๋๋ฌธ์ Contract๋ก RequestMultiplePermissions()๋ฅผ ์ฌ์ฉํด์ผ ํจ. ๋ฐ๋ผ์ ๋ฐ์ฒ์ ์ ๋ค๋ฆญ์ ๋ฌธ์์ด ๋ฐฐ์ด์ธ <Array<String>>์ด ๋จ
lateinit var locationPermission: ActivityResultLauncher<Array<String>>
onCreate() ๋ฉ์๋ ์๋์ ๋น startProcess() ๋ฉ์๋๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋ .
fun startProcess() {
// ์น์ธ ํ ์คํํ ์ฝ๋๋ฅผ ์
๋ ฅ
}
onCreate() ๋ฉ์๋ ์์ ๋ฐ์ฒ๋ฅผ ์์ฑํ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์์์ ์ ์ธํด ๋ ๋ณ์์ ์ ์ฅ.
locationPermission =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
results -> if (results.all{ it.value }) {
startProcess()
} else {
Toast.makeText(this, "๊ถํ ์น์ธ์ด ํ์ํฉ๋๋ค.",
Toast.LENGTH_LONG).show()
}
}
๋ฐ๋ก ์๋์ค์ ๋ฐ์ฒ๋ฅผ ์คํํด์ ๊ถํ ์น์ธ์ ์์ฒญ. 2๊ฐ์ ๊ถํ์ ํ๋ผ๋ฏธํฐ์ ์ ๋ฌํด์ผ๋๊ธฐ ๋๋ฌธ์ arrayOf()๋ฅผ ์ฌ์ฉํด์ ๊ถํ 2๊ฐ๋ฅผ ๊ฐ์ด launch()์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ ฅ.
locationPermission.launch(arrayOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
))
์์น ๊ถํ์ด ์น์ธ๋๋ฉด startProcess() ๋ฉ์๋์์ ๊ตฌ๊ธ ์ง๋๋ฅผ ์ค๋นํ๋ ์์ ์ ์งํํ๋๋ก ์ฝ๋๋ฅผ ์์ . onCreate()์ ์์ฑ๋์ด ์๋ val mapFragment ๋ก ์์ํ๋ ์ธ ์ค์ ์๋ผ๋ด๊ธฐ ํ ํ startProcess() ๋ฉ์๋ ์์ ๋ถ์ฌ๋ฃ๊ธฐ ํ๋ฉด ๋จ.
fun startProcess() {
// ์น์ธ ํ ์คํํ ์ฝ๋๋ฅผ ์
๋ ฅ
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
}
์ด์ ๊ถํ์ด ๋ชจ๋ ์น์ธ๋๊ณ ๋งต์ด ์ค๋น๋๋ฉด onMapReady() ๋ฉ์๋๊ฐ ์ ์์ ์ผ๋ก ํธ์ถ.
ํ์ฌ ์์น ๊ฒ์ํ๊ธฐ
1. onCreate() ์์ onMapReady() ์์น๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ณ์ 2๊ฐ๋ฅผ ์ ์ธ
โ fusedLocationClient๋ ์์น๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํด์ ํ์ํ๊ณ , locationCallback์ ์์นซ๊ฐ ์์ฒญ์ ๋ํ ๊ฐฑ์ ์ ๋ณด๋ฅผ ๋ฐ๋ ๋ฐ ํ์
private lateinit var fusedLocationClient: FusedLocationProviderClient
private lateinit var locationCallback: LocationCallback
2. onMapReady() ์์ ์๋๋ ์ขํ ์ฝ๋๋ฅผ ์ญ์ ํ ๋ค์, ์์น ๊ฒ์ ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ณ updateLocation() ๋ฉ์๋๋ฅผ ํธ์ถ
override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
fusedLocationClient =
LocationServices.getFusedLocationProviderClient(this)
updateLocation()
}
3. updateLocation() ๋ฉ์๋๋ฅผ ์์ฑ.
- ์์น ์ ๋ณด๋ฅผ ์์ฒญํ ์ ํ๋์ ์ฃผ๊ธฐ๋ฅผ ์ค์ ํ locationRequest๋ฅผ ๋จผ์ ์์ฑํ๊ณ , ํด๋น ์ฃผ๊ธฐ๋ง๋ค ๋ฐํ๋ฐ์ locationCallback์ ์์ฑ
- onMapReady์์ ์์ฑํ ์์น ๊ฒ์ ํด๋ผ์ด์ธํธ์ requestLocationUpdates()์ ์์์ ์์ฑํ 2๊ฐ์ ๋ฃจํผ ์ ๋ณด๋ฅผ ๋๊ฒจ์ค
- ์ด์ 1์ด(1,000๋ฐ๋ฆฌ์ด)์ ํ ๋ฒ์ฉ ๋ณํ๋ ์์น์ ๋ณด๊ฐ LocationCallback์ onLocationResult()๋ก ์ ๋ฌ์ด ๋จ.
- onLocationResult()๋ ๋ฐํ๋ฐ์ ์ ๋ณด์์ ์์น ์ ๋ณด๋ฅผ setLastLoation()์ผ๋ก ์ ๋ฌ.
- fusedLocationClient.requestLocationUpdates ์ฝ๋๋ ๊ถํ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ฐ ํ์ฌ ์ฝ๋์์๋ ํ์ธํ ์ ์์.
- ๋ฐ๋ผ์ ๋ฉ์๋ ์๋จ์ ํด๋น ์ฝ๋๋ฅผ ์ฒดํฌํ์ง ์์๋ ๋๋ค๋ ์๋ฏธ๋ก @SuppressLint("MissingPermission") ์ ๋ํ ์ด์ ์ ๋ฌ์์ค.
@SuppressLint("MissingPermission")
fun updateLocation() {
val locationRequest = LocationRequest.create()
locationRequest.run {
priority = LocationRequest.PRIORITY_HIGH_ACCURACY
interval = 1000
}
locationCallback = object: LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
locationResult?.let {
for ((i, location) in it.locations.withIndex()) {
Log.d("Location", "$i ${location.latitude}, ${location.longitude}")
setLastLoation(location)
}
}
}
}
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper())
4. updateLocation() ๋ฉ์๋ ์๋์ ์์น ์ ๋ณด๋ฅผ ๋ฐ์์ ๋ง์ปค๋ฅผ ๊ทธ๋ฆฌ๊ณ ํ๋ฉด์ ์ด๋ํ๋ setLastLoation()์ ์์ฑ
fun setLastLoation(lastLocatin: Location) { }
5. ์ ๋ฌ๋ฐ์ ์์น ์ ๋ณด๋ก ์ขํ๋ฅผ ์์ฑํ๊ณ ํด๋น ์ขํ๋ก ๋ง์ปค๋ฅผ ์์ฑ
fun setLastLoation(lastLocatin: Location) {
val LATLNG = LatLng(lastLocatin.latitude, lastLocatin.longitude)
val markerOptions =
MarkerOptions().position(LATLNG).title("Here!")
}
6. ์นด๋ฉ๋ผ ์์น๋ฅผ ํ์ฌ ์์น๋ก ์ธํ ํ๊ณ ๋ง์ปค์ ํจ๊ป ์ง๋์ ๋ฐ์.
โ ๋ง์ปค๋ฅผ ์ง๋์ ๋ฐ์ํ๊ธฐ ์ ์ mMap.clear()๋ฅผ ํธ์ถํด์ ์ด์ ์ ๊ทธ๋ ค์ง ๋ง์ปค๊ฐ์์ผ๋ฉด ์ง์
fun setLastLoation(lastLocatin: Location) {
val LATLNG = LatLng(lastLocatin.latitude, lastLocatin.longitude)
val markerOptions =
MarkerOptions().position(LATLNG).title("Here!")
val cameraPosition =
CameraPosition.Builder().target(LATLNG).zoom(15.0f).build()
mMap.clear()
mMap.addMarker(markerOptions)
mMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)
}
[ ๋ด์ฉ ์ฐธ๊ณ : IT ํ์ ๊ฐ์ ]
'Android Studio' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android Studio] SQLite ์์ (2) ํ๋ฉด์ ๋ง๋ค๊ณ ์์ค ์ฝ๋ ์ฐ๊ฒฐ (1) | 2024.05.23 |
---|---|
[Android Studio] SQLite ์์ (1) MyDBHelper๋ฅผ ์ธ๋ถ ํด๋์ค๋ก ์์ฑ (0) | 2024.05.21 |
[Android Studio] SQLite (1) | 2024.05.16 |
[Android Studio] ์กํฐ๋นํฐ์ ์ธํ ํธ์ ์์ฉ (0) | 2024.05.12 |
[Android Studio] ์ธํ ํธ ํ์ฉํ ๋ช ํ ํฌํ (0) | 2024.05.11 |