2014년 8월 29일 금요일

GPS 위도,경도,주소 불러오기

<Android> GPS 위도,경도,주소 불러오기

http://hin1341.tistory.com/3



/**
 * Android 위치 정보
 * ------------------------------------
 * 1) 퍼미션 추가 : android.permission.ACCESS_FILE_LOCATION
 * ------------------------------------
 * (구현절차)
 * 
 * 1. onCreate --> GPS를 제어할 수 있는 LocationManager 객체 생성
 *   1) 현재 사용 가능한 위치 정보 장치 중에서
 *       가장 정확도 높은 장치를 판별
 *   2) 마지막으로 조회되었던 위치 정보(위도,경도)가 존재하는지
 *      체크하고, 있다면 그 위치로 초기값 설정 
 * 
 * 2. onResume에서 GPS를 구동
 *  --> LocationManager 객체에 이벤트 연결
 *   위치정보 장치 이름, 갱신 기간 주기, 갱신 거리 주기를 설정
 * 
 * 3. onPause에서 GPS를 중지
 *   --> LocationManager 객체에 이벤트 해제
 * */


package itwill.ucity.locationex;

import java.util.List;
import java.util.Locale;

import android.app.Activity;
import android.content.Context;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements LocationListener{
 
 TextView tv1 = null;
 TextView tv2 = null;
 
 //위치정보 객체
 LocationManager lm = null;
 //위치정보 장치 이름
 String provider = null;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  tv1 = (TextView)findViewById(R.id.textView1);
  tv2 = (TextView)findViewById(R.id.textView2);
  
  /**위치정보 객체를 생성한다.*/
  lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
  
  /** 현재 사용가능한 위치 정보 장치 검색*/
  //위치정보 하드웨어 목록
  Criteria c = new Criteria();
  //최적의 하드웨어 이름을 리턴받는다.
  provider = lm.getBestProvider(c, true);
  
  // 최적의 값이 없거나, 해당 장치가 사용가능한 상태가 아니라면, 
  //모든 장치 리스트에서 사용가능한 항목 얻기
  if(provider == null || !lm.isProviderEnabled(provider)){
   // 모든 장치 목록
   List<String> list = lm.getAllProviders();
   
   for(int i = 0; i < list.size(); i++){
    //장치 이름 하나 얻기
    String temp = list.get(i);
    
    //사용 가능 여부 검사
    if(lm.isProviderEnabled(temp)){
     provider = temp;
     break;
    }
   }
  }// (end if)위치정보 검색 끝
  
  /**마지막으로  조회했던 위치 얻기*/
  Location location = lm.getLastKnownLocation(provider);
  
  if(location == null){
   Toast.makeText(this, "사용가능한 위치 정보 제공자가 없습니다.", Toast.LENGTH_SHORT).show();
  }else{
   //최종 위치에서 부터 이어서 GPS 시작...
   onLocationChanged(location);
   
  }
 }
 /** 이 화면이 불릴 때, 일시정지 해제 처리*/
 @Override
 public void onResume(){
  //Activity LifrCycle 관련 메서드는 무조건 상위 메서드 호출 필요
  super.onResume();
  
  //위치정보 객체에 이벤트 연결
  lm.requestLocationUpdates(provider, 500, 1, this);
 }
 /** 다른 화면으로 넘어갈 때, 일시정지 처리*/
 @Override
 public void onPause(){
  //Activity LifrCycle 관련 메서드는 무조건 상위 메서드 호출 필요
  super.onPause();
  
  //위치정보 객체에 이벤트 해제
  lm.removeUpdates(this);
 }

 /** 위치가 변했을 경우 호출된다.*/
 @Override
 public void onLocationChanged(Location location) {
  // 위도, 경도
  double lat = location.getLatitude();
  double lng = location.getLongitude();
  
 /* // String이외의 데이터 형을 String으로 변환하는 메서드
  tv1.setText(String.valueOf(lat));
  // String이외의 데이터 형을 String으로 변화하는 꼼수~!!
  tv2.setText(lng +""); */
  
  // String이외의 데이터 형을 String으로 변환하는 메서드
  tv1.setText(String.valueOf(lat) + " / " + String.valueOf(lng));
  // String이외의 데이터 형을 String으로 변화하는 꼼수~!!
  tv2.setText(getAddress(lat, lng));

 }
 @Override
 public void onProviderDisabled(String provider) {
  // TODO Auto-generated method stub
  
 }
 @Override
 public void onProviderEnabled(String provider) {
  // TODO Auto-generated method stub
  
 }
 @Override
 public void onStatusChanged(String provider, int status, Bundle extras) {
  // TODO Auto-generated method stub
  
 }
 
 /** 위도와 경도 기반으로 주소를 리턴하는 메서드*/
 public String getAddress(double lat, double lng){
  String address = null;
  
  //위치정보를 활용하기 위한 구글 API 객체
  Geocoder geocoder = new Geocoder(this, Locale.getDefault());
  
  //주소 목록을 담기 위한 HashMap
  List<Address> list = null;
  
  try{
   list = geocoder.getFromLocation(lat, lng, 1);
  } catch(Exception e){
   e.printStackTrace();
  }
  
  if(list == null){
   Log.e("getAddress", "주소 데이터 얻기 실패");
   return null;
  }
  
  if(list.size() > 0){
   Address addr = list.get(0);
   address = addr.getCountryName() + " "
     + addr.getPostalCode() + " "
     + addr.getLocality() + " "
     + addr.getThoroughfare() + " "
     + addr.getFeatureName();
  }
  
  return address;
  
  
  
 }
 
 

}

댓글 3개:

  1. android.permission.ACCESS_FINE_LOCATION 으로 변경 부탁드려요

    답글삭제
  2. android.permission.ACCESS_FINE_LOCATION 으로 변경 부탁드려요

    답글삭제
  3. 작성자가 댓글을 삭제했습니다.

    답글삭제