본문 바로가기
안드로이드/센서

안드로이드 GPS

by 김어찐 2022. 6. 25.
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