안드로이드 개발자의 창고
[51일차 Android] Location 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
📖 Location
GPS : Global Positioning System
- 단말기와 네트워크 망, 위성 등을 모두 연결해 현재 위치를 측정할 수 있는 시스템
- 안드로이드는 단말기 내부에서 가용한 위치 측정 수단을 모두 동원해 위치를 측정하고 있다.
- 애플리케이션에 측정된 위치 값을 가져다 사용할 수 있다.
Porovider
- 안드로이드는 위치 측정을 위해 위치 정보 제공자를 선택해서 사용하며 가급적이면 모든 위치 정보 제공자를 사용하는 것이 좋다.
- GPS Provider : GPS 위성과 통신하여 3각 측량 방법을 이용해 위치 정보를 습득한다. 위성과의 전파 송수신이 방해가 되는 요인(방해전파, 실내, 건물내, 계곡 등)이 있으면 정확한 위치를 측정할 수 없다.
- Network Provider : 이동통신 기지국, Wifi ap 등 통신망을 통해 위치 측정
- Passive Provider : 직접 위치를 측정하는 것이 아닌 다른 애플리케이션이 구한 값을 받아 사용하는 방식
Permission
- Provider 별로 권한을 등록해야 한다.
- GPS : ACCESS_FINE_LOCATION
- Network : ACCESS_COARS_LOCATION 또는 ACCESS_FINE_LOCATION
- Passive : ACCESS_FINE_LOCATION
예제 코드
class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
// 권한 목록
val permissionList = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
// 위치 측정 리스너
var locationListener:LocationListener? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
// 권한 확인
requestPermissions(permissionList, 0)
activityMainBinding.run {
button.setOnClickListener {
// 사용자의 권한 허용 여부 확인
val a1 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_FINE_LOCATION)
val a2 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_COARSE_LOCATION)
// 권한을 모두 허용했다면
if(a1 == PackageManager.PERMISSION_GRANTED && a2 == PackageManager.PERMISSION_GRANTED){
// 위치 정보를 관리하는 관리자 추출
val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
// 마지막으로 저장된 위치 값을 가져온다.
val location1 = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
val location2 = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
// 기존에 추출된 정보가 있다면 일단 이것으로 먼저 사용한다.
if(location1 != null){
showInfo(location1)
} else if(location2 != null) {
showInfo(location2)
}
// 위치 측정 리스너
locationListener = object: LocationListener{
// 위치가 새롭게 측정되면 호출되는 메서드
override fun onLocationChanged(p0: Location) {
showInfo(p0)
}
}
// GPS Provider가 사용 가능하다면 측정을 요청
if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) == true){
// 첫 번째 : 요청할 프로바이더
// 두 번째 : 측정할 시간 주기. 0을 넣어주면 가장 짧은 주기마다 측정을 한다. (단위 ms)
// 세 번째 : 측정할 거리 단위. 0을 넣어주면 가장 짧은 거리마다 측정을 한다. (단위 m)
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f){
showInfo(it!!)
}
}
// Network Provider가 사용 가능하다면 측정을 요청한다.
if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) == true){
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0f){
showInfo(it!!)
}
}
} else {
requestPermissions(permissionList, 0)
}
}
// 위치 측정 중단
button2.setOnClickListener {
if(locationListener != null){
val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
locationManager.removeUpdates(locationListener!!)
locationListener = null
}
}
}
setContentView(activityMainBinding.root)
}
fun showInfo(location: Location){
if(location != null){
activityMainBinding.run{
textView.text = "Provider : ${location.provider}"
textView2.text = "위도 : ${location.latitude}"
textView3.text = "경도 : ${location.longitude}"
}
}
}
}
결과
'Computer > Android' 카테고리의 다른 글
[52일차 Android] 앨범에서 사진 가져오기 (0) | 2023.07.24 |
---|---|
[52일차 Android] 사진 촬영하기 (0) | 2023.07.24 |
[52일차 Android] Sensor (0) | 2023.07.20 |
[51일차 Android] Device Information(단말기 정보 파악) (0) | 2023.07.19 |
[51일차 Android] Screen Rotation(화면 회전 대응) (0) | 2023.07.19 |