GPS 위도,경도,주소 불러오기
/** * 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; } }
안드로이드(Android) GPS 정보 알아오기
http://mainia.tistory.com/1153
안드로이드(Android) GPS 정보 알아오기 |
개발환경 : window 7 64bit, Eclipse Mars, Android 4.2.2 |
안드로이드에서 GPS 정보를 가져와서 자기 위치를 MAP 에 표시한다던지 다른사람에게 위치 정보를 알릴수도 있습니다. 이렇듯 GPS 정보를 알아오는 방법은 다양하게 쓰입니다. |
먼저 AndroidManifest.xml 에 GPS 정보를 가져올수
있도록 환경을 셋팅해야 합니다.
1 2 | < uses-permission android:name = "android.permission.INTERNET" /> < uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" /> |
GPS 정보를 알아오는 클래스에 대해서
알아봅니다. 클래스명은 GpsInfo.java 입니다.
추상클래스 Service 와 위치정보를 받아오기
위한 Listener 인터페이스 클래스 LocationListener
상속합니다.
그리고 GPS나 네트워크 사용유무, 얼마에
한번씩 데이터를 업데이트 할 것인지에 대한
변수들을 만듭니다.
실질적으로 위치정보를 알아오는 클래스는
LocationManager 입니다. 이것도 변수지정해 놓습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | private final Context mContext; // 현재 GPS 사용유무 boolean isGPSEnabled = false ; // 네트워크 사용유무 boolean isNetworkEnabled = false ; // GPS 상태값 boolean isGetLocation = false ; Location location; double lat; // 위도 double lon; // 경도 // 최소 GPS 정보 업데이트 거리 10미터 private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10 ; // 최소 GPS 정보 업데이트 시간 밀리세컨이므로 1분 private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1 ; protected LocationManager locationManager; |
다음은 GPS 위치값을 가져오기 위한 함수입니다.
LocationManager 을 사용하였으며 requestLocationUpdates()
함수로 현재 정보를 업데이트 하고 getLastKnownLocation()
함수로 위치값을 가져옵니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | this .isGetLocation = true ; // 네트워크 정보로 부터 위치값 가져오기 if (isNetworkEnabled) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this ); if (locationManager != null ) { location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null ) { // 위도 경도 저장 lat = location.getLatitude(); lon = location.getLongitude(); } } } if (isGPSEnabled) { if (location == null ) { locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this ); if (locationManager != null ) { location = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null ) { lat = location.getLatitude(); lon = location.getLongitude(); } } } } |
위 함수를 실행전에 GPS 상태정보와 네트워크 정보를
가져와 제대로 환경이 되어있지 않다면 정보를
가져오는 부분을 스킵하겠죠.
1 2 3 4 5 6 7 | // GPS 정보 가져오기 isGPSEnabled = locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER); // 현재 네트워크 상태 값 알아오기 isNetworkEnabled = locationManager.isProviderEnabled( LocationManager.NETWORK_PROVIDER); |
이렇게 환경정보를 확인했는데 제대로 되어있지
않다면 GPS 정보가 제대로 설정 되어있는지
확인을 위한 alert 창을 띄우게 되고, 설정창으로
바로 가서 다시 GPS 를 사용할수 있도록
셋팅페이지로 가게 하는 기능입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public void showSettingsAlert(){ AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); alertDialog.setTitle( "GPS 사용유무셋팅" ); alertDialog.setMessage("GPS 셋팅이 되지 않았을수도 있습니다. \n 설정창으로 가시겠습니까?"); // OK 를 누르게 되면 설정창으로 이동합니다. alertDialog.setPositiveButton( "Settings" , new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); mContext.startActivity(intent); } }); // Cancle 하면 종료 합니다. alertDialog.setNegativeButton( "Cancel" , new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); alertDialog.show(); } |
아래는 GPS 정보를 가져오기 위한 GpsInfo.java 의
전체 소스입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | import android.app.AlertDialog; import android.app.Service; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.IBinder; import android.provider.Settings; public class GpsInfo extends Service implements LocationListener { private final Context mContext; // 현재 GPS 사용유무 boolean isGPSEnabled = false ; // 네트워크 사용유무 boolean isNetworkEnabled = false ; // GPS 상태값 boolean isGetLocation = false ; Location location; double lat; // 위도 double lon; // 경도 // 최소 GPS 정보 업데이트 거리 10미터 private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10 ; // 최소 GPS 정보 업데이트 시간 밀리세컨이므로 1분 private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1 ; protected LocationManager locationManager; public GpsInfo(Context context) { this .mContext = context; getLocation(); } public Location getLocation() { try { locationManager = (LocationManager) mContext .getSystemService(LOCATION_SERVICE); // GPS 정보 가져오기 isGPSEnabled = locationManager .isProviderEnabled(LocationManager.GPS_PROVIDER); // 현재 네트워크 상태 값 알아오기 isNetworkEnabled = locationManager .isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!isGPSEnabled && !isNetworkEnabled) { // GPS 와 네트워크사용이 가능하지 않을때 소스 구현 } else { this .isGetLocation = true ; // 네트워크 정보로 부터 위치값 가져오기 if (isNetworkEnabled) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this ); if (locationManager != null ) { location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null ) { // 위도 경도 저장 lat = location.getLatitude(); lon = location.getLongitude(); } } } if (isGPSEnabled) { if (location == null ) { locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this ); if (locationManager != null ) { location = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null ) { lat = location.getLatitude(); lon = location.getLongitude(); } } } } } } catch (Exception e) { e.printStackTrace(); } return location; } /** * GPS 종료 * */ public void stopUsingGPS(){ if (locationManager != null ){ locationManager.removeUpdates(GpsInfo. this ); } } /** * 위도값을 가져옵니다. * */ public double getLatitude(){ if (location != null ){ lat = location.getLatitude(); } return lat; } /** * 경도값을 가져옵니다. * */ public double getLongitude(){ if (location != null ){ lon = location.getLongitude(); } return lon; } /** * GPS 나 wife 정보가 켜져있는지 확인합니다. * */ public boolean isGetLocation() { return this .isGetLocation; } /** * GPS 정보를 가져오지 못했을때 * 설정값으로 갈지 물어보는 alert 창 * */ public void showSettingsAlert(){ AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); alertDialog.setTitle( "GPS 사용유무셋팅" ); alertDialog.setMessage("GPS 셋팅이 되지 않았을수도 있습니다. \n 설정창으로 가시겠습니까?"); // OK 를 누르게 되면 설정창으로 이동합니다. alertDialog.setPositiveButton( "Settings" , new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); mContext.startActivity(intent); } }); // Cancle 하면 종료 합니다. alertDialog.setNegativeButton( "Cancel" , new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); alertDialog.show(); } @Override public IBinder onBind(Intent arg0) { return null ; } public void onLocationChanged(Location location) { // TODO Auto-generated method stub } public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } } |
GPS 정보를 사용하는 메인 Activity 전체 소스입니다.
Toast 를 이용해 화면에 위치 정보를 띄우고
TextView 에 위도와 경도를 알려줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; /** GPS 샘플 */ public class SampleActivity21 extends Activity { private Button btnShowLocation; private TextView txtLat; private TextView txtLon; // GPSTracker class private GpsInfo gps; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_sample_activity21); btnShowLocation = (Button) findViewById(R.id.btn_start); txtLat = (TextView) findViewById(R.id.Latitude); txtLon = (TextView) findViewById(R.id.Longitude); // GPS 정보를 보여주기 위한 이벤트 클래스 등록 btnShowLocation.setOnClickListener( new View.OnClickListener() { public void onClick(View arg0) { gps = new GpsInfo(SampleActivity21. this ); // GPS 사용유무 가져오기 if (gps.isGetLocation()) { double latitude = gps.getLatitude(); double longitude = gps.getLongitude(); txtLat.setText(String.valueOf(latitude)); txtLon.setText(String.valueOf(longitude)); Toast.makeText( getApplicationContext(), "당신의 위치 - \n위도: " + latitude + "\n경도: " + longitude, Toast.LENGTH_LONG).show(); } else { // GPS 를 사용할수 없으므로 gps.showSettingsAlert(); } } }); } } |
'차근차근 > Android' 카테고리의 다른 글
안드 사진촬영정보 null일 때 (0) | 2015.01.06 |
---|---|
안드로이드(Android) GPS 정보 (0) | 2015.01.06 |
GPS 로 구하는 위치좌표 (0) | 2015.01.06 |
http://uangelstory.tistory.com/m/post/170 여기글 다시 읽어볼것 (0) | 2015.01.05 |
안드로이드 소스내 DPI변경 (0) | 2014.12.29 |