반응형
프로젝트 하고 있는 앱에서 현재 단말기의 위치를 확인해야 하기 때문에
급하게 GPS 먼저 공부해버리기
GPS(Global Positioning System)
- 단말기와 네트워크망/위성 등을 모두 연결해 현재 위치를 측정할 수 있는 시스템
- 안드로이드 단말기 내부에서 가용한(사용이 가능한) 위치측정 수단을 모두 동원해 위치를 측정 -> 쓸 수 있는 모든 도구는 다 사용해 진심으로 위치측정을 하기 때문에 꽤 정확하다는 의미ㅎㅎ
- 애플리케이션에 측정된 위치값을 가져다가 사용이 가능
- gps 센서는 이미 앱에서 돌아가고 있는 필요시 앱에서 그 측정값을 가져다 사용 (앱은 gps 사용 허용, 권한설정을 함)
Provider
- 앱이 직접 위치를 측정하는게 아니라 시스템 내부에 있는 장치/센서들이 측정한 정보를 받아다가 쓰는 원리 -> 위치 정보 제공자 선택 (가급적 모든 위치 제공자 사용하는게 좋음)
- GPS : gps 위성과 통신해 3각 측량 방법을 이용해 위치 정보 습득, 꽤 정밀, 위성과의 전파 송수신 방해요소 있을시 어렵(방해전파, 실내, 건물내, 계곡)
- Network Provider : 이동통신 기지국, wifi ap 등 통신망을 상용
- Passive Provider : 직접 위치를 측정X, 다른 애플리케이션이 구한 값을 받아 사용
- Provider 별로 권한 등록 필요
- GPS : ACCESS_FINE_LOCATION
- Network Provider : ACCESS_FINE_LOCATION 또는 ACCESS_COARS_LOCATION
- Passive Provider : ACCESS_FINE_LOCATION
class MainActivity : AppCompatActivity() {
private lateinit var binding:ActivityMainBinding
val permissionList = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
requestPermissions(permissionList,0)
//측정값을 새로 측정해 가져오려면 시간 걸릴 수 있어서 이전에 계산해 놓은 가장 최근 위치값을 먼저 보여주고
//다시 측정되면 갱신 (안드로이드는 그냥 일정 시간마다 한번씩 위치값 갱신함)
//requestPermissions() 밑에서 위치값 가져오는 코드 작성시, 권한 허용 물어보는 창 뜨면서 혼자서 돌아감 -> 따로 처리해주는게 좋음
}
override fun onRequestPermissionsResult(
requestCode: Int, // requestPermissions() 에서 전달하는 requestCode 값 -> 이 코드에 따라 분기
permissions: Array<out String>, // 확인할 권한들
grantResults: IntArray // 허용 or 거부 값
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
for (r1 in grantResults) {
if (r1 == PackageManager.PERMISSION_DENIED) {
//하나라도 거부된 권한이 있으면 바로 끝냄
return
}
}
// 위치 정보 관리하는 매니저 추출
val manager = getSystemService(LOCATION_SERVICE) as LocationManager
//권한 다 허용됐는지 위치 정보 가져오기 전 한번더 확인
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return
}
//저장되어 있는 위치 정보값 가져옴
val locatoin1 = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER) //가장 마지막으로 측정되었던 gps 위치값 가져옴
val locatoin2 = manager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER) //가장 마지막으로 측정되었던 network provider 위치값 가져옴
if (locatoin1 != null) {
showInfo(locatoin1) //gps가 더 정밀하니까 먼저 조건문 들어가게!!
} else if (locatoin2 != null) {
showInfo(locatoin2)
}
//리스너 설정하고, 버튼 기능 구현을 onCreate() 외부에서 한다 하더라도 한번 설정 되면 기능 계속 하는거니까 걱정 노노
//버튼 같은건 이미지 다 뷰바인딩 되어 있으니까?? (내가 생각한 이유 아맠ㅋ)
val listener = LocationListener{
showInfo(it) // 리스너를 달면측정된 위치정보가 바로 it으로 들어오기 때문에 바로 위치 출력 가능
}
binding.button.setOnClickListener {
//해당 provider가 사용할 수 있는지를 확인
if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER) == true) { //GPS_PROVIDE가 현재 사용가능한 상태면 값 측정
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f,listener) //측정 주기 (0,0f 로 하면 최적화 해서 맞춰줌, 가장 실시간(단말기가 가장 최소 딜레이 타임으로 가져올 수 있게끔))
/* 버튼 클릭시 GPS_PROVIDER 가 사용 가능하면 측정해서 listener로 보내주고
* 리스너는 그 값을 it으로 바로 받아 출력 */
}
// 항상 둘다 돌려준다는데 이러면 GPS가 측정하고 또 측정해서 괜히 값이 더 구려지는 거 아닌가 (else if 로 해줘도 될듯)
if (manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) == true) {
manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0f,listener)
}
}
binding.button2.setOnClickListener {
manager.removeUpdates(listener)
}
}
fun showInfo(locatoin : Location){
if (locatoin != null) {
binding.textView.text = "Provider : ${locatoin.provider}"
binding.textView2.text = "위도 : ${locatoin.latitude}"
binding.textView3.text = "경도 : ${locatoin.longitude}"
}
}
}
gps로 사용자 현재 위치 측정 방법
권한 설정 확인 -> 권한 확인 되면 그때 가장 최근 위치값 받아옴(현재 위치 측정 딜레이 때문에 그냥 설정해주는거) -> 현재 위치 측정 (버튼 클릭 or 실시간으로 계속 측정되도록 할 수도)
위치 측정 매니저를 생성해서 그 매니저로 가장 최근 계산한 위치값도 받아오고, 현재 위치 측정도 다시 하도록 하고!
현재 위치를 측정할때는 리스너를 달아서 측정한 위치값을 바로바로 이벤트 처리 할 수 있도록 함
val manager = getSystemService(LOCATION_SERVICE) as LocationManager
val locatoin1 = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f,listener)
반응형
'Android' 카테고리의 다른 글
[안드로이드/Activity] Parcelable, Serializable 그리고 Parcelize (1) | 2023.07.13 |
---|---|
[안드로이드/소셜로그인&Oauth] AWS와 통신하는 안드로이드 앱에서 Google Oauth2.0 사용하기 (4) | 2023.07.13 |
[안드로이드/Oauth/Error] Google Oauth2.0 파이어베이스 없이 사용하기 & ApiException 10 에러 해결 (2) | 2023.05.13 |
[안드로이드/데이터입출력] assets (0) | 2023.04.29 |
[안드로이드/데이터 관리] Raw 파일 읽어오기 (0) | 2023.04.29 |