저자: Vikram Goyal
위치 인식 애플리케이션을 개발하는 것은 다른 애플리케이션에 비해 시작하기가 어려워서 매우 까다로운 작업으로 느껴질 수 있습니다.
이 테크팁에서는 위치 API(JSR 179)를 사용하여 즐겨 찾는 위치에 태그를 지정하는 데 사용할 수 있는 작은 위치 인식 애플리케이션을
구축하고 초기 장애를 해결하는 방법에 대해 설명합니다.
필자는 MIDlet가 Nokia N95 장치에서 작동하는 것을 테스트하고 확인했습니다.
사용자 장치에서 테스트할 경우 위치 API(JSR 179)가 지원되는지 확인하십시오.
전체 프로세스를 다음과 같은 3단계로 나누어 봤습니다.
1.위치 제공자 찾기 및 초기화
2.이 제공자에서 제공된 위치 업데이트 수신 및 활용
3.즐겨 찾는 위치 저장 및 나열
지금부터 이 단계들을 자세히 설명하겠습니다.
이 MIDlet 소스 코드의 전체 소스 코드를 함께 참조하면서 각 단계의 코드 일부를 따라하면 효과적일 것입니다.
1단계: 위치 제공자 찾기 및 초기화
적합한 위치 제공자를 찾는 프로세스는 2개의 단계로 나뉩니다. 먼저 위치 제공자에 대한 일련의 기준을 생성해야 하며, 그런 다음 이 기준을 사용하여 이 제공자의 인스턴스를 생성해야 합니다.
위치 API는 이 두 단계에 대해 2개의 클래스, 즉 Criteria 및 LocationProvider를 제공합니다.
유효한 기준을 생성하려면 이 클래스의 인스턴스를 생성하고 기준에 대해 다양한 매개 변수를 설정합니다.
아래 코드는 소스 코드에서 가져왔으며, 본 팁의 목적에 부합하는 기준을 생성합니다.
// create a very basic criteria for the provider
Criteria criteria = new Criteria();
criteria.setHorizontalAccuracy(Criteria.NO_REQUIREMENT);
criteria.setVerticalAccuracy(Criteria.NO_REQUIREMENT);
criteria.setPreferredResponseTime(Criteria.NO_REQUIREMENT);
criteria.setCostAllowed(false);
위 코드에서 보듯이 기준이 매우 낮습니다. 수평이나 수직 정확도 또는 응답 시간에 대한 특정 요구사항이 없으며, 위치 API 사용과 관련하여 비용이 발생하면 안 된다는 제한만 있습니다(네트워크 제공자에 연결될 수 있음).
이 기준에 기반한 제공자를 제공할 수 있는 장치에 위치 API가 내장된 경우에만 작업을 수행할 수 있으며, 작업 지침으로 이 기준을 사용하여 제공자에 대한 LocationProvider 클래스를 요청하여 작업을 수행합니다.
// get the provider based on this criteria
LocationProvider provider = LocationProvider.getInstance(criteria);
// provider found
if (provider != null) {
provider.setLocationListener(this, -1, 0, 0);
} else {
display.setCurrent(
new Alert("Error!",
"Phone does not support Location Provider with the given criteria",
null, AlertType.ERROR));
}
지정된 기준을 포함한 제공자를 찾을 수 없을 경우 사용자에게 메시지가 표시되며 MIDlet를 실행할 수 없습니다.
하지만 장치에서 유효한 위치 제공자를 제공할 수 있을 경우 MIDlet에서 위치 리스너를 설정하여 위치 제공자에서 제공하는 모든 업데이트를 수신하며, 이 경우 리스너는 MIDlet 자신이 됩니다.
2단계: 위치 업데이트 수신 및 활용
이전 단계에서 위치 리스너가 MIDlet 자신으로 설정되었습니다. 즉 MIDlet은 LocationListener 클래스에서 제공하는 두 개의 메소드, 즉 locationUpdated(LocationProvider lp, Location l) 및 providerStateChanged(LocationProvider lp, int newState)를 구현해야 합니다.
아래 코드는 locationUpdated 메소드를 구현합니다.
// if valid location is found, update the coords and status
if(location != null && location.isValid()) {
QualifiedCoordinates coords = location.getQualifiedCoordinates();
coordsDisplay.setText(
truncate(coords.getLatitude()) + ", " +
truncate(coords.getLongitude()));
statusDisplay.setText("Available");
currentLocation = location;
} else {
coordsDisplay.setText("--, --");
statusDisplay.setText("Unavailable");
currentLocation = null;
}
장치의 위치가 업데이트될 때마다 위치 제공자가 locationUpdated 메소드의 Location 매개 변수를 사용하여 새 위치를 전송합니다.
새 위치의 좌표는 getQualifiedCoordinates 메소드를 사용하여 선택할 수 있습니다.
물론 장치가 GPS 위성 범위를 벗어날 경우 제공자가 정확한 좌표를 가지고 올 수 없어 실제 위치가 Null이거나 유효하지 않을 수 있습니다.
메소드에서는 장치의 현재 위치 및 상태를 업데이트하기 전에 장치가 위성 범위를 벗어나는지 여부를 점검합니다.
providerStateChanged 메소드는 위치 제공자가 GPS 위성 범위에 포함되고 제외될 때 업데이트를 수락합니다.
하지만 필자는 Nokia N95에서 providerStateChanged 메소드에 대한 업데이트가 확실하게 전송되지 않는다는 것을 확인했습니다.
그래서 locationUpdated 메소드를 사용하여 제공자 상태를 확인했습니다.
하지만 다른 장치에서 제대로 작동하는 경우에는 providerStateChanged 메소드의 코드를 그대로 사용했습니다.
참고:
만일의 경우에 대비하여 locationUpdated 메소드(및 해당 providerStateChanged 메소드)가 자신의 스레드에 있어야 보통 MIDlet 스레드를 차단하지 않습니다.
3단계: 즐겨 찾는 위치 저장 및 나열
위도와 경도를 사용하여 현재 위치가 파악되고 나면 태그를 사용하여 이 위치를 즐겨 찾는 위치로 저장하는 것은 간단합니다.
위치 API는 지표점 저장소를 제공하여 위치를 알기 쉽게 표시합니다.
사용자는 자신만의 지표점 저장소를 새로 생성하거나 기본적으로 제공되는 지표점 저장소를 사용할 수 있습니다.
기본 지표점 저장소는 장치의 모든 MIDlet에서 공유됩니다. 지표점 저장소를 새로 생성하려면 LandmarkStore 클래스에서 제공된 정적 메소드를 사용합니다. 다음 코드에서와 같이 null로 전달되면 이 인스턴스의 기본 저장소가 요청됩니다.
store = LandmarkStore.getInstance(null);
지표점 저장소에는 Landmark 클래스를 사용한 위치 세부사항이 포함됩니다. 다음 코드에서 보여주듯이 이름(즐겨 찾는 위치 이름으로 사용자가 입력한 이름), 설명(아래 코드에서는 비어 있음) 및 중요한 모든 좌표를 제공하여 지표점을 생성할 수 있으며, 이 생성자에서 수락된 마지막 매개 변수는 실제 주소 정보를 저장하는 데 사용할 수 있는 AddressInfo 개체입니다(제공자에서 지원되는 경우). 이 예에서는 가능한 간단하게 세부 정보를 표시했습니다.
// create the landmark
Landmark landmark =
new Landmark(name, "", currentLocation.getQualifiedCoordinates(), null);
// and save it
try {
store.addLandmark(landmark, null);
display.setCurrent(
new Alert("Message", "Done", null, AlertType.INFO), displayForm);
return;
} catch(Exception ex) {
handleError(ex);
}
지표점을 생성하고 나면 addLandmark 메소드를 사용하여 저장소에 저장할 수 있습니다.
두 번째 매개 변수는 해당 지표점에 대한 범주를 지정하지만 필자는 간단하게 설명하기 위해 지표점을 기본 범주에 포함시켰습니다.
기존 지표점 목록은 getLandmarks 메소드를 사용하여 가져올 수 있습니다. 이 메소드는 반복할 수 있는 열거를 반환하여 목록의 사용자에게 표시하며, 다음 코드에 나와 있습니다.
Enumeration en = store.getLandmarks();
while(en.hasMoreElements()) {
Landmark landmark = (Landmark)en.nextElement();
landmarkList.append(
landmark.getName() +
" - " +
truncate(landmark.getQualifiedCoordinates().getLatitude()) + ", " +
truncate(landmark.getQualifiedCoordinates().getLongitude()), null);
자료:
소스 코드 - Netbeans 프로젝트
위치 API(JSR 179)
이 글의 영문 원본은
Using the Location API for Favorite Spots
에서 보실 수 있습니다.
"Java ME" 카테고리의 다른 글
- 블루투스와 GPS 사용: 1부 - 무선 직렬 포트 데이터 읽기 (댓글 0개 / 트랙백 0개) 2008/08/11
- 서비스 지향 아키텍처 및 자바 ME (댓글 7개 / 트랙백 0개) 2007/04/10
- destroyApp()는 당신의 친구 (댓글 0개 / 트랙백 0개) 2009/09/28
- 자바 ME 장치 매트릭스로 필터 사용 (댓글 0개 / 트랙백 0개) 2008/03/13
- Java ME를 사용한 블루레이 디스크 애플리케이션 개발 제 1 부: 나만의 애플리케... (댓글 0개 / 트랙백 0개) 2008/10/13
- 모바일 플랫폼의 비교: Java ME와 Adobe Flash Lite (댓글 0개 / 트랙백 1개) 2008/06/03
- NetBeans Mobility Pack 5.0 입문을 위한 속성 가이드 (댓글 5개 / 트랙백 0개) 2006/09/26
- 모바일 자바 플랫폼의 현재와 미래 (댓글 5개 / 트랙백 1개) 2006/07/26
- MIDlet의 로깅과 모니터링을 위한 간단한 전략 (댓글 0개 / 트랙백 0개) 2009/10/22
- 아프리카에서 전하는 소식: 이 지역에서 자바 ME 플랫폼에 주어진 과제와 기회 (댓글 0개 / 트랙백 0개) 2008/12/16
댓글을 달아 주세요