차근차근/Android

안드로이드(Android) GPS 정보

예쁜꽃이피었으면 2015. 1. 6. 13:10


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

<Android> GPS 위도,경도,주소 불러오기 http://andriod77.blogspot.kr/2014/08/gps_29.html

/**
 * 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 를 사용할수 있도록

셋팅페이지로 가게 하는 기능입니다.

 

안드로이드(Android) 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) GPS 정보 알아오기


반응형