실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


문제점

gps를 잘 사용하다가 언제부턴가 계속 위치를 가져오지 못한다.

아마 재부팅 후 부터 가져오질 못하는것 같다. 로그는 남겨서 어디까지 실행하는지 확인해봤다.

먼저 선언부이다.

Location location;
protected LocationManager locationManager;

locationManager = (LocationManager) mContext.getSystemService(mContext.LOCATION_SERVICE);
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);



먼저 GPS가 활성화되어 있을 때 날짜를 Toast로 출력하였다 사진엔 보이진 않지만 정상적으로 실행되었다.

1번 로그와 2번 로그 모두 확인할 수 있었다. 하지만 3번 로그가 출력되지 않았다.

location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

위 코드에서 문제가 있는 것 같다. getLastKnownLocation()은 이전에 저장된 위치정보을 가져오기 때문에 재부팅 후에는 null값을 반환한다.



해결방안

퍼미션으로 추가한 android.permission.ACCESS_FINE_LOCATION 은 위성과 직접 연결하여 현재 위치를 받아오는 것이다. 

핸드폰을 재부팅하거나 GPS 위치정보를 가지고 있지 않은 경우(GPS를 한번도 사용하지 않았다면)에 건물내부에서 GPS만을 사용하는 앱으로 테스트를 할 경우 현재 위치를 가져올수 없기 때문에 getLastKnownLocation()은 마지막에 GPS를 구동시켰던 장소를 가져오게 된다. 하지만 마지막 위치정보가 없기 때문에 null값이 반환된다.


실외에서 GPS를 활성화 시키고 대략 10초가량 기다린 후에 앱을 실행시켜보니(혹은 위치정보를 가져오는 버튼을 클릭했을 경우) 정상적으로 현재위치를 확인할 수 있었다.


위치정보를 계속 가져오는 것을 바란다면 정확성은 떨어지지만 조건문을 사용해서 GPS가 활성화 되어있지 않으면 네트워크 정보를 가져오는 방법이 있다. 전체 코드는 아니지만 확인해보길 바란다.

public Location getLocation() {
	try {
		locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);

		// GPS, NETWORK 활성화 여부 확인
		isGPSEnabled = locationManager.
			isProviderEnabled(LocationManager.GPS_PROVIDER);
		isNetworkEnabled = locationManager.
			isProviderEnabled(LocationManager.NETWORK_PROVIDER);

		if (!isGPSEnabled && !isNetworkEnabled) {
			// 모두 비활성화의 경우
		} else {
			this.canGetLocation = true;
			if (isNetworkEnabled && !isGPSEnabled) {
				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) {
						data.setLatitude(location.getLatitude());
						data.setLongitude(location.getLongitude());
					}
				}
			} else 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) {
							data.setLatitude(location.getLatitude());
							data.setLongitude(location.getLongitude());
						}
					}
				}
			}
		}

	} catch (Exception e) {
		e.printStackTrace();
	}

	return location;
}


참고1, 참고2

+ Recent posts