본문 바로가기
Kotlin/Kotlin 팁

Android 구글 지도에서 내 위치 표시하기

by MonoSoft 2020. 10. 21.
728x90
반응형

Android 구글 지도에서 내 위치 표시하기

우선 구글 API를 등록하고 등록한 API 위에 입력을 해준다.

 

 

 

GPS와 네트워크를 사용하기 위해 권한을 설정해준다 위와 같이 코딩해준다.

 

 

 

그리고 제일 중요한 build.gradle 에 로케이션을 추가해준다 버전체클 잘하고 수정한뒤 싱크 나우를 꼭 해준다!!!

 

 

 

 

MapsActivity에 다음과 같이 코딩하고 파악하고 이해해 보쟈!

 

 

 

package com.monosoft.mygooglemap

import android.annotation.SuppressLint
import android.content.pm.PackageManager.PERMISSION_GRANTED
import android.location.Location
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Looper
import android.util.Log
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.google.android.gms.location.*

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.SupportMapFragment
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 java.util.jar.Manifest

class MapsActivity : AppCompatActivity(), OnMapReadyCallback {

//권한
val permaission = arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION,android.Manifest.permission.ACCESS_COARSE_LOCATION)
val PERM_FLAG = 99

private lateinit var mMap: GoogleMap

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_maps)
// Obtain the SupportMapFragment and get notified when the map is ready to be used.

if(isPermitted()) {
startProcess()
} else {
//권한요청
ActivityCompat.requestPermissions(this,permaission,PERM_FLAG)
}
}

fun isPermitted() : Boolean {
for (perm in permaission) {
if (ContextCompat.checkSelfPermission(this, perm) != PERMISSION_GRANTED) {
return false
}
}
return false
}

fun startProcess() {
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment

mapFragment.getMapAsync(this)
}

/**
* Manipulates the map once available.
* This callback is triggered when the map is ready to be used.
* This is where we can add markers or lines, add listeners or move the camera. In this case,
* we just add a marker near Sydney, Australia.
* If Google Play services is not installed on the device, the user will be prompted to install
* it inside the SupportMapFragment. This method will only be triggered once the user has
* installed Google Play services and returned to the app.
*/
override fun onMapReady(googleMap: GoogleMap) {
//onCreate에서 getMapAsync(this) 사용허가를 구하면 안드로이드가 이걸 발동시킨다.
mMap = googleMap

// Add a marker in Sydney and move the camera

fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
setUpdateLocationListener()
/*
val sydney = LatLng(-34.0, 151.0)
mMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
*/
}

// -- 내 위치를 가져오는 코드
//클라이언트라는 변수
lateinit var fusedLocationClient : FusedLocationProviderClient //나중에 초기화할꺼야 lateinit
//FusedLocationProviderClient는 배터리 소모도 적게 하고 정확도 높여주는 거
lateinit var locationCallback : LocationCallback //나중에 초기화할꺼야 lateinit
//LocationCallback 좌표값을 가져오고 그 응답값을 받아서 처리해주는 것

//좌표값을 계속 갱신주는것을 등록해주는 함수
@SuppressLint("MissingPermission")
fun setUpdateLocationListener() {
val locationRequest = LocationRequest.create()
locationRequest.run {
//locationRequest 놈안테 priority 재설정
priority = LocationRequest.PRIORITY_HIGH_ACCURACY //정확도 높게하는대신 배터리 소모 있음
interval = 1000 //1초에 한번씩
//1초에 한번씩 GPS+network 사용해 좌표값을 가져오겠다
}

//받을 그릇
locationCallback = object : LocationCallback() {
override fun onLocationResult( locationResult : LocationResult?) {
//값이 있을때만 밑에 실행해라
locationResult?.let {
//locationResult(it)
for ((i,location) in it.locations.withIndex()) { //withIndex 인텍스와 함께 꺼낼수있음
Log.d("로케이션", "$i ${location.latitude}, ${location.longitude}")
setLastLocation(location)
}
}
}
}

//로케이션 요청함수 호출 (loactionRequest, locaationCallback)

fusedLocationClient.requestLocationUpdates(locationRequest,locationCallback,Looper.myLooper())
}

fun setLastLocation(location : Location) {
val myLocation = LatLng(location.latitude, location.longitude)
val marker = MarkerOptions()
.position(myLocation)
.title("I am here!")
val cameraOption = CameraPosition.Builder()
.target((myLocation))
.zoom(15.0f)
.build()
val camera = CameraUpdateFactory.newCameraPosition(cameraOption)

mMap.clear()
mMap.addMarker(marker)
mMap.moveCamera(camera)
}

override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
when(requestCode) {
PERM_FLAG -> {
var check = true
for(grant in grantResults) {
if(grant != PERMISSION_GRANTED) {
check = false
break
}
}
if(check) {
startProcess()
} else {
Toast.makeText(this,"권한을 승인해야지만 앱을 사용할 수 있습니다",Toast.LENGTH_LONG).show()
finish()
}
}
}

}
}

 

 

 

=====================결과화면=========================

 

 

 

728x90
반응형

'Kotlin > Kotlin 팁' 카테고리의 다른 글

로그 활용하기  (0) 2022.06.17
구글 지도 Open API로 지도에 표시  (0) 2020.10.26
안드로이드 구글 API 맵 사용  (0) 2020.10.19
안드로이드 포어그라운드 사용  (0) 2020.10.15
안드로이드 서비스 활용  (0) 2020.10.14

댓글