728x90
Global Positioning System
단말기와 네트워크 망, 위성 등을 모두 연결해 현재 위치를 측정할 수 있는 시스템
안드로이드는 단말기 내부에서 가용한 위치 측정 수단을 모두 동원해 위치를 측정하고 있다.
애플리케이션에 측정된 위치 값을 가져다 사용할 수 있다.
Provider
안드로이드는 위치 측정을 위해 위치 정보 제공자를 선택해서 사용한다.
가급적이면 모든 위치 정보 제공자를 사용하는 것이 좋다.
GPS Provider : GPS 위성과 통신하여 3각 측량 방법을 이용해 위치 정보를 습득한다. 위성과의 전파 송수신이 방해가 되는 요인(방해전파, 실내, 건물내, 계곡 등)이 있으면 정확한 위치를 측정할 수 없다.
Network Provider : 이동통신 기지국, Wifi ap 등 통신망을 통해 위치를 측정할 수 있다.
Passive Provider : 직접 위치를 측정하는 것이 아닌 다른 애플리케이션이 구한 값을 받아 사용하는 방식이다.
권한
Provider 별로 권한을 등록해야 한다.
GPS : ACCESS_FINE_LOCATION
Network : ACCESS_COARS_LOCATION 또는 ACCESS_FINE_LOCATION
Passive : ACCESS_FINE_LOCATION
package com.example.gps
import android.Manifest
import android.content.pm.PackageManager
import android.location.Location
import android.location.LocationListener
import android.location.LocationManager
import android.location.LocationProvider
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.core.app.ActivityCompat
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
val permission_list = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
requestPermissions(permission_list,0)
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
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 location1 = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
val location2 = manager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
if(location1 != null){
showInfo(location1)
} else if(location2 !=null){
showInfo(location2)
}
val listener = LocationListener{
showInfo(it)
}
button.setOnClickListener {
if(manager.isProviderEnabled(LocationManager.GPS_PROVIDER)==true)
{
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0f,listener)
}
if(manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)==true){
manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0f,listener)
}
}
button2.setOnClickListener {
manager.removeUpdates(listener)
}
}
fun showInfo(location: Location){
if(location!= null){
textView.text = "Provider : ${location.provider}"
textView2.text = "위도 : ${location.latitude}"
textView3.text= "경도 : ${location.longitude}"
}
}
}
퍼미션
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.gps">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.GPS"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATIONr"/>
</manifest>
728x90
'안드로이드 > 센서' 카테고리의 다른 글
안드로이드 앨범에서 사진 가져오기 (0) | 2022.06.25 |
---|---|
안드로이드 사진 보정 (0) | 2022.06.25 |
안드로이드 사진 기능 (0) | 2022.06.25 |
안드로이드 센서 (0) | 2022.06.24 |
안드로이드 단말기 정보 파악 (0) | 2022.06.24 |