2013년 7월 18일 목요일

[Android] GPS를 이용해 나의 위치 확인하기(기본)

1. 사전지식

1.1 위치기반서비스

- 모바일 네트워크를 통해 휴대 단말에서 접근할 수 있는 위치 정보 활용 시스템 입니다.
- LBS는 스마트폰 단말에서 자신의 위치를 찾을 수 있게 되면서 활성화 되었다.

1.2 위치기반서비스 활용 분야

- 엔터테인먼트, 위급상황, 의료, 산업, 개인 생활 등등

1.3 대표적인 사용 예

- 가장 가까운 은행, 식당, 주유소, 호텔, 골프장, 병원, 경찰서 찾기
- 출발지부터 목적지까지 가는 길 찾기
- 친구나 가족들의 위치 또는 행사 장소등을 알려주는 소셜 네트워킹 서비스, 친구찾기

1.4 위치를 찾는 대표적인 방법 두가지

- GPS 위성을 이용한 위치 찾기
- 기지국의 타워 ID를 이용한 위치 찾기

1.5 기지국을 이용한 위치 찾기 (cell Tower Triangulation)

- 가까이 위치하고 있는 기지국과의 상대적인 거리를 이용하는 방법
- 휴대폰과 기지국 간의 거리는 기지국으로 부터 휴대폰까지 신호를 보내고 받는 데 따른 지연 시간(lag time)으로 계산

2. 주요 객체 소개

2.1 LocationManager 객체

- 시스템의 위치기반 서비스 접근 지원 하는 객체
- 주기적으로 바뀌는 단말의 위치정보 수신

2.2 LocationListener 객체

-위치정보를 전달 받기 위한 리스너

2.3 Location 객체

-위치는 위도(latitude)와 경도(longitude)로 표시되며 시간은 UTCtimestamp 로 표시되고 그외에 선택적으로 고도(altitude),속도(speed)그리고 bearing정보 표시


3. 기능 구현 순서

3.1 위치관리자 객체 참조 하기

- 코드 37줄

3.2 위치 리스너 구현하기

- 코드 69-98줄

3.3 위치정보 업데이트 요청하기 (동시에 리스너 등록)

- 코드 53줄

3.4 매니페스트에 권한 추가하기
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>  // GPS
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>  //기지국

4.예제
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MyLocationActivity extends Activity {

 TextView text01;
 LocationManager manager;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  text01 = (TextView) findViewById(R.id.text01);
  Button button01 = (Button) findViewById(R.id.button01);
  button01.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // LocationManager 객체 초기화 , LocationListener 리스너 설정
    getMyLocation();
   }
  });
 }

 // LocationManager 객체 초기화 , LocationListener 리스너 설정
 private void getMyLocation() {
  if (manager == null) {
   manager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
  }
  // provider 기지국||GPS 를 통해서 받을건지 알려주는 Stirng 변수
  // minTime 최소한 얼마만의 시간이 흐른후 위치정보를 받을건지 시간간격을 설정 설정하는 변수
  // minDistance 얼마만의 거리가 떨어지면 위치정보를 받을건지 설정하는 변수
  // manager.requestLocationUpdates(provider, minTime, minDistance, listener);

  // 10초
  long minTime = 10000;
  
  // 거리는 0으로 설정 
  // 그래서 시간과 거리 변수만 보면 움직이지않고 10초뒤에 다시 위치정보를 받는다
  float minDistance = 0;

  MyLocationListener listener = new MyLocationListener();

  manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, listener);

  appendText("내 위치를 요청 했습니다.");
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.my_location, menu);
  return true;
 }

 private void appendText(String msg) {
  text01.append(msg + "\n");
 }

 class MyLocationListener implements LocationListener {

  // 위치정보는 아래 메서드를 통해서 전달된다.
  @Override
  public void onLocationChanged(Location location) {
   appendText("onLocationChanged()가 호출되었습니다");

   double latitude = location.getLatitude();
   double longitude = location.getLongitude();

   appendText("현재 위치:" + latitude + "," + longitude);
  }

  @Override
  public void onProviderDisabled(String provider) {

  }

  @Override
  public void onProviderEnabled(String provider) {

  }

  @Override
  public void onStatusChanged(String provider, int status, Bundle extras) {

  }

 }
}

댓글 2개:

  1. 잘 봤습니다!
    그런데 my_location 함수에서 에러가나는데.. 구현이없어서 그런듯합니다 ㅠ

    답글삭제