[퍼미션]

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

 

final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 최소 GPS 정보 업데이트 거리 10미터
final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 최소 GPS 정보 업데이트 시간 밀리세컨이므로 1분

final LocationManager locationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);

 final LocationListener gpsLocationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
        // 위치 리스너는 위치정보를 전달할 때 호출되므로 onLocationChanged()메소드 안에 위지청보를 처리를 작업을 구현 해야합니다.
        String provider = location.getProvider();  // 위치정보
        double longitude = location.getLongitude(); // 위도
        double latitude = location.getLatitude(); // 경도
        double altitude = location.getAltitude(); // 고도
        DLog.d(new Exception(), "위치정보 : " + provider + "\n" + "위도 : " + longitude + "\n" + "경도 : " + latitude + "\n" + "고도 : " + altitude);

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

    } public void onProviderEnabled(String provider) {

    } public void onProviderDisabled(String provider) {

    }
};

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, gpsLocationListener);

/*
Provider의 경우 3가지가 있음.
LocationManager.NETWORK_PROVIDER
LocationManager.GPS_PROVIDER
LocationManager.PASSIVE_PROVIDER

주의해야되는 부분은 GPS_PROVIDER의 경우 실내에서 사용하면 리스너가 동작하지 않을 수 있어 NETWORK_PROVIDER를 사용하는걸
권장함.

LocationListener를 사용하지 않고 아래처럼 바로 최근 위치 정보를 가져올 수도 있음.
GPS_PROVIDER를 사용했을때 location이 null 인경우가 있어 기본적으로 NETWORK_PROVIDER를 사용함.

Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
     String provider = location.getProvider();
     double longitude = location.getLongitude();
     double latitude = location.getLatitude();
     double altitude = location.getAltit
     DLog.d(new Exception(), "위치정보 : " + provider + "\n" +
             "위도 : " + longitude + "\n" +
             "경도 : " + latitude + "\n" +
             "고도  : " + altitude);
}
*/

 

개통이 안된 기기에서는 NETWORK_PROVIDER / GPS_PROVIDER 등 전부 동작 안되는 경우가 있음.

금융권 프로젝트시 이거 때문에 고생했음.

 

위도/경도로 상세주소 가져오기

private String getAddress(Context mContext, double lat, double lng)
{
    String nowAddr ="현재 위치를 확인 할 수 없습니다.";
    Geocoder geocoder = new Geocoder(mContext, Locale.KOREA);
    List<Address> address;

    try
    {
        if (geocoder != null)
        {
            address = geocoder.getFromLocation(lat, lng, 1);
            if (address != null && address.size() > 0)
            {
                // 전체 주소 한번에 가져올 수 있음
                nowAddr = address.get(0).getAddressLine(0).toString();

                // 조합해서 적용
                String country = address.get(0).getCountryName();        //대한민국
                String adminArea = "";
                String locality = "";
                if (address.get(0).getLocality() == null) {
                    // 광역시 일 경우
                    adminArea = address.get(0).getAdminArea();           // 광주광역시
                } else {
                    adminArea = address.get(0).getAdminArea();           // 충청북도
                    locality = address.get(0).getLocality();             // 청주시
                }
                String subLocality = address.get(0).getSubLocality();    // 북구
                String thoroughfare = address.get(0).getThoroughfare();  // 매곡동
                String subThoroughfare = address.get(0).getSubThoroughfare(); // 89번지

                DLog.i(new Exception(), country + " " + adminArea + " " + locality + " " + subLocality + " " + thoroughfare + " " + subThoroughfare);
                DLog.i(new Exception(), "");
            }
        }
    }
    catch (IOException e)
    {
        Toast.makeText(mContext, "주소를 가져 올 수 없습니다.", Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
    return nowAddr;
}

+ Recent posts