개발 가이드

Local Navigation

Geolocation 서비스를 사용하여 단말기 위치 검색

다음 절차는 Geolocation 서비스를 사용하여 BlackBerry 단말기의 위치를 제공하는 UI 프로그램을 만드는 방법을 보여 줍니다.

시작하기 전에: BlackBerry 단말기 또는 BlackBerry Smartphone Simulator에서 Geolocation 서비스에 액세스할 수 있는지 확인합니다.
  1. 필요한 클래스와 인터페이스를 가져옵니다.
    import net.rim.device.api.gps.*;
    import net.rim.device.api.system.Application;
    import net.rim.device.api.ui.*;
    import net.rim.device.api.ui.component.*;
    import net.rim.device.api.ui.container.*;
    import javax.microedition.location.*;
  2. UiApplication 클래스를 확장하여 프로그램 구조를 만듭니다. main()에서 새 클래스의 인스턴스를 만들고 enterEventDispatcher()를 호출하여 프로그램이 이벤트를 수신할 수 있도록 합니다. 프로그램 생성자에서 pushScreen()을 호출하여 프로그램의 사용자 정의 화면을 표시합니다. 3단계에서 설명하는 GeolocationScreen 클래스는 사용자 정의 화면을 나타냅니다.
    public final class GeolocationDemo extends UiApplication
    {
        public static void main(String[] args)
        {
            GeolocationDemo theApp = new GeolocationDemo();
            theApp.enterEventDispatcher();
        }
        public GeolocationDemo() 
        {
            pushScreen(new GeolocationScreen());
        }
    }
  3. MainScreen 클래스를 확장하여 사용자 정의 화면의 구조를 만듭니다. 화면에 표시되는 좌표를 저장하는 LabelField 클래스를 만듭니다. 위도 및 경도 값을 저장하는 double 변수를 2개 만듭니다.
    class GeolocationScreen extends MainScreen
    {
        private LabelField _coordLabel;
        private double _latitude;
        private double _longitude;
    }
  4. 화면 생성자에서 super()를 호출하여 기본 메뉴를 만듭니다. setTitle()을 호출하여 화면 제목을 지정합니다.
    public GeolocationScreen() 
    {
        super(DEFAULT_CLOSE | DEFAULT_MENU);
        setTitle(new LabelField("Geolocation Demo", Field.USE_ALL_WIDTH | 
                DrawStyle.HCENTER));
    }
  5. 화면 생성자에서 ButtonField 클래스의 인스턴스를 만들어 단말기의 Geolocation을 검색하기 위해 BlackBerry 단말기 사용자가 클릭하는 버튼을 만듭니다. Field.setChangeListener()를 호출하여 이 버튼의 상태 변경을 수신합니다. 6단계에서 설명한 findGeolocation()을 호출하여 사용자가 버튼을 클릭하면 Geolocation을 검색합니다. add()를 호출하여 버튼을 화면에 추가합니다. 결과 좌표를 표시할 LabelField 클래스의 인스턴스를 만들고 add()를 호출하여 이 필드를 화면에 추가합니다.
    ButtonField geolocButton = new ButtonField("Get geolocation", 
            ButtonField.CONSUME_CLICK);
    geolocButton.setChangeListener(new FieldChangeListener()
        {
            public void fieldChanged(Field field, int context)
            {
                findGeolocation();
            }
        });
    add(geolocButton);
    this._coordLabel = new LabelField();
    add(this._coordLabel);
  6. findGeolocation 메소드의 구조를 만듭니다. 빈 String 값을 사용해 setText()를 호출하여 LabelField에서 좌표를 지웁니다. run()을 호출하는 Thread 클래스의 인스턴스를 만듭니다. 이 스레드는 Geolocation 정보의 검색을 처리하는 데 사용됩니다. run()에서 try/catch 블록을 만들어 Geolocation 모드를 지정합니다. BlackBerryCriteria()를 호출하고 LocationInfo.GEOLOCATION_MODE를 모드로 전달하여 BlackBerryCriteria 클래스의 인스턴스를 만들어 Geolocation 정보를 검색합니다. catch 블록에서 10단계에 설명된 showException()을 호출하여 UnsupportedOperationException 오류 메시지를 표시합니다.
    private void findGeolocation()
    {
        this._coordLabel.setText("");
        Thread geolocThread = new Thread() 
        {
            public void run() 
            {
                try
                {
                    BlackBerryCriteria myCriteria = new BlackBerryCriteria(
                            LocationInfo.GEOLOCATION_MODE);
                } 
                catch (UnsupportedOperationException e) 
                {
                   showException(e);
                }
            }
        };
        geolocThread.start();
    }
  7. 첫 번째 try 블록에서 두 번째 try/catch 블록을 만들어 위치 공급자를 검색합니다. BlackBerryCriteria 객체를 사용해 LocationProvider.getInstance()를 호출하여 위치 공급자를 검색합니다. catch 블록에서 10단계에 설명된 showException()을 호출하여 LocationException 오류 메시지를 표시합니다.
    try
    {
        BlackBerryLocationProvider myProvider = (BlackBerryLocationProvider)
                LocationProvider.getInstance(myCriteria);
    }
    catch (LocationException e)
    {
        showException(e);
    }
  8. 두 번째 try 블록에서 세 번째 try/catch 블록을 만들어 위치 정보를 검색합니다. 매개 변수 -1로 기본 시간 제한 값을 사용해 BlackBerryLocationProvider.getLocation()을 호출하여 위치 공급자를 검색합니다. getLongitude()getLatitude()를 호출하여 경도 및 위도 좌표를 각각 검색합니다. StringBuffer 클래스의 인스턴스를 만들고 결과 좌표를 버퍼에 추가합니다. String 변수를 만들고 StringBuffer 객체를 사용해 toString()을 호출하여 좌표에 해당하는 String 값을 반환합니다. 9단계에서 설명한 showResults()를 호출하여 화면에 결과를 표시합니다. 첫 번째 catch 블록에서 10단계에 설명된 showException()을 호출하여 InterruptedException 오류 메시지를 표시합니다. 두 번째 catch 블록에서 10단계에 설명된 showException()을 호출하여 LocationException 오류 메시지를 표시합니다.
    try
    {
        BlackBerryLocation myLocation =(BlackBerryLocation)myProvider
                .getLocation(-1);
        _longitude = myLocation.getQualifiedCoordinates().getLongitude();
        _latitude = myLocation.getQualifiedCoordinates().getLatitude();
        StringBuffer sb = new StringBuffer();
        sb.append("Longitude: ");
        sb.append(_longitude);
        sb.append("\n");
        sb.append("Latitude: ");
        sb.append(_latitude);
        String msg = sb.toString();
        showResults(msg);
    }
    catch (InterruptedException e)
    {
        showException(e);
    }
    catch (LocationException e)
    {
        showException(e);
    }
  9. showResults 메소드에서 invokeLater()를 호출하여 이 코드 섹션을 프로그램의 이벤트 큐에 추가합니다. Runnable 클래스의 인스턴스를 만들고 이를 매개 변수로 invokeLater()에 전달합니다. Runnable의 정의에서 run()을 재정의합니다. String 변수를 사용해 setText()를 호출하여 LabelField에 대해 결과 좌표를 지정합니다.
    private void showResults(final String msg)
    {
        Application.getApplication().invokeLater(new Runnable()
        {
            public void run()
            {
                GeolocationScreen.this._coordLabel.setText(msg);
            }
        });
    }
  10. showException 메소드에서 invokeLater()를 호출하여 이 코드 섹션을 프로그램의 이벤트 큐에 추가합니다. Runnable의 인스턴스를 만들고 이를 매개 변수로 invokeLater()에 전달합니다. Runnable의 정의에서 run()을 재정의합니다. Dialog.alert()를 호출하여 알림 대화 상자를 만들고, getMessage()를 호출하여 오류 메시지를 전달합니다.
    private void showException(final Exception e) 
    {
        Application.getApplication().invokeLater(new Runnable()
        {
            public void run()
            {
                Dialog.alert(e.getMessage());
            }
        });
    }

이 정보가 도움이 되었습니까? 의견을 보내 주십시오.