개발 가이드

Local Navigation

최적 단일 수정값 검색

다음 절차는 Geolocation 또는 GPS 위치 소스에서 검색될 수 있는 사용 가능한 위치 수정값 중 가장 빠른 수정값을 제공하는 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단계에서 설명하는 SingleFixScreen 클래스는 사용자 정의 화면을 나타냅니다.
    public final class SingleFixDemo extends UiApplication
    {
        public static void main(String[] args)
        {
            SingleFixDemo theApp = new SingleFixDemo();
            theApp.enterEventDispatcher();
        }
        public SingleFixDemo() 
        {
            pushScreen(new SingleFixScreen());
        }
    }
  3. MainScreen 클래스를 확장하여 사용자 정의 화면의 구조를 만듭니다. 화면에 표시하려는 좌표를 저장하는 LabelField 클래스를 만듭니다. 위도 및 경도 값을 저장하는 double 변수를 2개 만듭니다. 위치 모드를 저장하는 integer 변수와 String 변수를 하나씩 만듭니다.
    class SingleFixScreen extends MainScreen 
    {
        private LabelField _coordLabel;
        private double _latitude;
        private double _longitude;
        private int _modeUsed;
        private String _mode;
    }
  4. 화면 생성자에서 super()를 호출하여 기본 메뉴를 만듭니다. setTitle()을 호출하여 화면 제목을 지정합니다.
    public SingleFixScreen() 
    {
        super(DEFAULT_CLOSE | DEFAULT_MENU);
        setTitle(new LabelField("Single Fix Demo", Field.USE_ALL_WIDTH | 
                DrawStyle.HCENTER));
    }
  5. 화면 생성자에서 ButtonField 클래스의 인스턴스를 만들어 단말기의 위치를 검색하기 위해 BlackBerry 단말기 사용자가 클릭하는 버튼을 만듭니다. Field.setChangeListener()를 호출하여 이 버튼의 상태 변경을 수신합니다. 6단계에서 설명한 findLocation()을 호출하여 사용자가 버튼을 클릭하면 Geolocation을 검색합니다. add()를 호출하여 버튼을 화면에 추가합니다. 결과 좌표를 표시할 LabelField 클래스의 인스턴스를 만들고 add()를 호출하여 이 필드를 화면에 추가합니다.
    ButtonField locButton = new ButtonField("Get location fix", 
            ButtonField.CONSUME_CLICK);
    locButton.setChangeListener(new FieldChangeListener()
    {
        public void fieldChanged(Field field, int context)
        {
            findLocation();
        }
    });
    add(locButton);
    this._coordLabel = new LabelField();
    add(this._coordLabel);
  6. findLocation 메소드의 구조를 만듭니다. 빈 String 값을 사용해 setText()를 호출하여 LabelField에서 좌표를 지웁니다. run()을 호출하는 Thread 클래스의 인스턴스를 만듭니다. 이 스레드는 위치 정보의 검색을 처리하는 데 사용됩니다. run()에서 try/catch 블록을 만들어 위치 검색에 대한 기준을 지정합니다. BlackBerryCriteria()를 호출하여 BlackBerryCriteria 클래스의 인스턴스를 만듭니다. 이 샘플에서는 BlackBerryCriteria()로 인수가 전달되지 않기 때문에 기본 위치 모드가 사용됩니다. enableGeolocationWithGPS(BlackBerryCriteria.FASTEST_FIX_PREFERRED)를 호출하여 사용 가능한 첫 번째 위치 수정값을 검색합니다. catch 블록에서 10단계에 설명된 showException()을 호출하여 UnsupportedOperationException 오류 메시지를 표시합니다.
    private void findLocation()
    {
        this._coordLabel.setText("");
        Thread locThread = new Thread() 
        {
            public void run() 
            {
                try
                {
                    BlackBerryCriteria myCriteria = new BlackBerryCriteria();
                    myCriteria.enableGeolocationWithGPS(BlackBerryCriteria
                            .FASTEST_FIX_PREFERRED);
                } 
                catch (UnsupportedOperationException e) 
                {
                   showException(e);
                }
            }
        };
        locThread.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() 를 호출하여 경도 및 위도 좌표를 각각 검색합니다. getGPSMode()를 호출하여 위치 검색에 사용되는 모드를 검색합니다. 사용되는 모드가 GPS 또는 Geolocation인지 확인하는 switch 블록을 만듭니다. 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();
        _modeUsed = myLocation.getGPSMode();
        switch (_modeUsed)
        {
            case LocationInfo.GEOLOCATION_MODE:
            case LocationInfo.GEOLOCATION_MODE_CELL:
            case LocationInfo.GEOLOCATION_MODE_WLAN:
                _mode = "Geolocation";
                break;
            default:
                _mode = "GPS";
        }    
        StringBuffer sb = new StringBuffer();
        sb.append("Longitude: ");
        sb.append(_longitude);
        sb.append("\n");
        sb.append("Latitude: ");
        sb.append(_latitude);
        sb.append("\n");
        sb.append("Mode: ");
        sb.append(_mode);
        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()
            {
                SingleFixScreen.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());
            }
        });
    }

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