[Android] 위치 제공자 : 상황별 '최적 위치 제공자(Best Location Provider)' 선정 테스트

2011. 10. 2. 04:14IT, Smart Life


"나는 네가 어디에 있는지를 알고 있다"



안드로이드에서 말하는 '위치 제공자'란?



  스마트폰 어플 중 많은 어플들이 위치 기반 서비스(LBS, Location Based Service)를 포함하고 있습니다.

  어떤 단말기를 쓰던지, 어떤 운영체제를 쓰던지간에 위치 기반 서비스를 이용하기 위해서는 위치 정보가 필요하고, 또 이러한 위치 정보는 위치에 대한 정보를 제공하는 ‘누군가’가 필요합니다. 이때, 이 '누군가'가 바로 위치 제공자(Location Provider)입니다.

  위치 제공자는 'GPS 모듈'처럼 같이 단말기에 부착된 하드웨어 일 수도 있고, 무선 네트워크나 전화 기지국과 같이 불특정 다수가 이용할 수 있는 기간시설이나 구조물일 수도 있습니다. 위치를 제공해줄 수 있는 기술이 더 는다면 이 위치 제공자도 늘어나게 되겠죠~
 

  어찌 되었든, ‘안드로이드 OS를 탑재한 단말기’에는 기본적으로 하나 이상의 위치 제공자가 존재합니다.

  따라서, 우리가 안드로이드 단말기에서 '구글 맵(Google Map)'과 같은 위치 기반 서비스를 이용할 때, 우리 눈에 보이지는 않지만 단말기 내부에서는, 그 상황에서의 위치를 제공해주는 위치 제공자가 어떤 것들이 있는지를 확인하고, 미리 설정해둔 기준들을 토대로 최적의 위치 제공자를 선택해서 위치 정보를 공급받는 과정을 거칩니다.

  < 안드로이드 프로그래밍 정복>에서 언급한 바와 같이, 최적의 위치 제공자를 판별하는데 이용되는 기준에는 여러가지가 있는데, 안드로이드 OS에서 그 각각의 기준들에 대해 얼마나 가중치를 주고 있는지는 아직 잘 모르겠습니다.

  위치 제공자 목록은 위치 관리자(Location Manager)에 의해서 관리됩니다.






내 폰의 '위치 제공자' 확인하기
  

  그럼 이제.......

-  내 폰에 위치를 제공해줄 수 있는 위치 제공자는 어떤 것들이 있는지,
-  그 중에 최적의 제공자는 무엇인지,
-  지금 쓸 수는 있는건지 

한번 확인해 봅시다. ^_^

  아래는 안드로이드 단말기(Nexus S, Android 2.3.4)의 위치 제공자와 최적 위치 제공자, 그리고 각 위치 제공자의 사용 가능성에 대해서 조사하고 출력하도록한 소스코드와 결과입니다. 소스코드는 < 안드로이드 프로그래밍 정복 : 위치 제공자 >의 내용을 참고하였고 원문 코드와 비교해보면 알겠지만, 이용가능 여부 판별에서 'passive'에 대한 코드를 추가했습니다.

  실내와 실외, GPS on/off 여부에 따라 4가지 Case로 나누어 테스트하였습니다.
  

소스코드

package exam.andexam;


import java.util.List;


import android.app.Activity;

import android.content.Context;

import android.location.Criteria;

import android.location.LocationManager;

import android.os.Bundle;

import android.widget.TextView;


public class C24_GetProvider extends Activity {

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.c24_getprovider);


// 위치 관리자 구함

LocationManager LocMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);


// 제공자 목록 구해서 출력

List<String> arProvider = LocMan.getProviders(false);

String result = "";

for (int i = 0; i < arProvider.size(); i++) {

result += ("Provider " + i + " : " + arProvider.get(i) + "\n");

}


// 최적의 제공자 조사

Criteria crit = new Criteria();

crit.setAccuracy(Criteria.NO_REQUIREMENT);

crit.setPowerRequirement(Criteria.NO_REQUIREMENT);

crit.setAltitudeRequired(false);

crit.setCostAllowed(false);

String best = LocMan.getBestProvider(crit, true);

result += ("\nbest provider : " + best + "\n\n");


// GPS와 네트워크 제공자 사용 가능성 조사

result += LocationManager.GPS_PROVIDER + " : "

+ LocMan.isProviderEnabled(LocationManager.GPS_PROVIDER) + "\n";

result += LocationManager.NETWORK_PROVIDER + " : "

+ LocMan.isProviderEnabled(LocationManager.NETWORK_PROVIDER)

+ "\n";

result += LocationManager.PASSIVE_PROVIDER + " : "

+ LocMan.isProviderEnabled(LocationManager.PASSIVE_PROVIDER)

+ "\n";


// 결과 출력

TextView EditResult = (TextView) findViewById(R.id.result);

EditResult.setText(result);

}

}



Android 위치 제공자 목록
  - network : 통신망, 3G
  - passive : passive provider. 
                  다른 앱에서 사용한 위치 정보를 수동적으로 가져올 수 있다는 의미
                  (http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html)
  - GPS : GPS





Case1 : 실내, GPS On 



Best Provider : NETWORK




Case2 : 실내, GPS Off
 

 
Best Provider : NETWORK

  
 

Case3 : 실외, GPS On



Best Provider : NETWORK




Case4 : 실외, GPS Off


Best Provider : NETWORK
 

  테스트를 진행하면 알게된 한가지 중요한 사실은,  [ 위치 제공자 사용 가능 여부 ] 판별에서 GPS는 GPS 신호 송수신 여부와 관계없이 장치의 On/Off 여부에 따라 true/false가 변경된다는 것입니다. 즉, GPS 위치 제공자를 사용할 수 있다는 신호가 들어와도 그것이 GPS 신호의 성공적인 수신을 보장해주지 못한다는 이야기이므로, 코딩할 때 유의해야 할 것 같습니다.




테스트 결과와 의문점 


상황별 Best Location Provider Test 결과





  테스트 결과는 다소 기이하게 나왔습니다.
  모든 상황에서 'NETWORK'가 최적의 위치 제공자로 판별된 것입니다.


  아무리 많은 통신기지국이 주변에 있고 그것들을 이용해 위치 계측 정밀도를 높인다하더라도 GPS 신호만큼 정밀할까요? 아마도 아닐 것입니다.


  그렇다면!? 아마도 최적 위치 제공자를 판별하는 기준으로 선언해 놓은 4가지 항목들이 적절치 않았을 수도 있겠죠. 소스 코딩 중에 최적 위치 제공자를 판별하는 기준 선언 부분을 연구해서 적절히 고쳐줄 수 있다면, 결과값은 우리가 일반적으로 예상하는 대로 달라질 수 있을 것 같습니다.

  다음에는 기준을 추가하거나 기준 설정을 수정해보고 결과를 비교해보도록 하겠습니다.



본 포스팅이 도움이 되셨다면, 추천/댓글을 달아주세요!! (^ㅁ^)/