개발 가이드

Local Navigation

여러 개의 최적 수정값 검색

다음 절차는 GPS 수정값을 사용할 수 있거나 지정된 시간 범위 내에 있는 경우에 GPS 수정값을 검색하여 위치를 지속적으로 업데이트하는 UI 프로그램을 만드는 방법을 보여 줍니다. GPS 수정값을 사용할 수 없으면 Geolocation 수정값이 대신 반환됩니다.

시작하기 전에: BlackBerry 단말기 또는 BlackBerry Smartphone Simulator에서 GPS를 사용할 수 있게 설정되어 있는지 확인합니다.
  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 클래스를 확장하여 프로그램 구조를 만듭니다. integer 변수를 만들고, 위치 좌표를 업데이트할 간격을 지정하는 값으로 1을 이 변수에 할당합니다. 화면에 표시되는 위치 업데이트를 저장할 EditField 형식의 변수를 만듭니다. main()에서 새 클래스의 인스턴스를 만들고 enterEventDispatcher()를 호출하여 프로그램이 이벤트를 수신할 수 있도록 합니다. 프로그램 생성자에서 7단계에 설명되어 있는 MultipleFixScreen 클래스의 인스턴스를 만듭니다. setTitle()을 호출하여 화면 제목을 지정합니다. EditField 클래스의 인스턴스를 만들고 이 필드를 화면에 추가합니다. 4단계에 설명되어 있는 startLocationUpdate()를 호출하여 위치 업데이트 검색을 시작합니다. pushScreen()을 호출하여 프로그램의 사용자 정의 화면을 표시합니다.
    public class MultipleFixDemo extends UiApplication 
    {    
        private static int _interval = 1;
        private EditField _status;    
        public static void main(String[] args)
        {
            new MultipleFixDemo().enterEventDispatcher();
        }
        public MultipleFixDemo()
        {
            MultipleFixScreen screen = new MultipleFixScreen();
            screen.setTitle("Multiple Fix Demo");
            _status = new EditField(Field.NON_FOCUSABLE);
            screen.add(_status);
            startLocationUpdate();
            pushScreen(screen);
        }
    }
  3. invokeLater()를 호출하는 updateLocationScreen 메소드를 만들어 이 코드 섹션을 프로그램의 이벤트 큐에 추가합니다. Runnable 클래스의 인스턴스를 만들고 이를 매개 변수로 invokeLater()에 전달합니다. Runnable의 정의에서 run()을 재정의합니다. setText()를 호출하여 결과를 화면에 표시합니다.
    private void updateLocationScreen(final String msg)
    {
        invokeLater(new Runnable()
        {
            public void run()
            {
                _status.setText(msg);
            }
        });
    }
  4. startLocationUpdate 메소드의 구조를 만듭니다. 위치 검색에 필요한 기준을 지정하기 위한 try/catch 블록을 만듭니다. BlackBerryCriteria()를 호출하여 BlackBerryCriteria 클래스의 인스턴스를 만듭니다. 이 샘플에서는 BlackBerryCriteria()로 인수가 전달되지 않기 때문에 기본 위치 모드가 사용됩니다. enableGeolocationWithGPS()를 호출하여 사용 가능한 GPS 수정값이 있으면 이를 검색하고 그렇지 않으면 Geolocation 수정값을 검색하도록 지정합니다. catch 블록에서 해당 위치 모드가 지원되지 않음을 나타내는 UnsupportedOperationException을 catch합니다.
    private void startLocationUpdate()
    {
        try
        {
            BlackBerryCriteria myCriteria = new BlackBerryCriteria();
            myCriteria.enableGeolocationWithGPS();
        catch (UnsupportedOperationException ue)
        {
            System.err.println("Require mode is unavailable");
            System.err.println(ue); 
            System.exit(0);   
        }
        return;
    }
  5. 첫 번째 try 블록에서 두 번째 try/catch 블록을 만들어 위치 공급자를 검색합니다. BlackBerryCriteria 객체를 사용해 LocationProvider.getInstance()를 호출하여 위치 공급자를 검색합니다. Runnable의 인스턴스를 만들고 이를 매개 변수로 invokeLater()에 전달합니다. Runnable의 정의에서 run()을 재정의하여 해당 위치 공급자를 검색할 수 없음을 알려주는 메시지를 표시합니다. 위치 공급자가 사용 가능한 경우 간격 값, 시간 제한 값 및 최대 기간을 매개 변수로 전달해 setLocationListener()를 호출하여 수신기를 등록합니다. catch 블록에서 해당 위치 공급자를 사용할 수 없음을 알려주는 LocationException을 catch합니다.
    try
    {
        BlackBerryLocationProvider myProvider = (BlackBerryLocationProvider)
                LocationProvider.getInstance(myCriteria);
        if ( myProvider == null )
        {
            Runnable showUnsupportedDialog = new Runnable() 
            {
                public void run() 
                {
                    Dialog.alert("Location service unsupported, exiting...");
                    System.exit( 1 );
                }
             };
             invokeLater( showUnsupportedDialog );  
         }
         else
         {
             myProvider.setLocationListener(new LocationListenerImpl(), 
                     _interval, 1, 1);
         }
    }
    catch (LocationException le)
    {
        System.err.println("Failed to retrieve a location provider");
        System.err.println(le); 
        System.exit(0);
    }
  6. LocationListener를 구현하는 두 번째 클래스를 만듭니다. 위치 업데이트를 제공할 locationUpdated()를 구현합니다. if 문을 만들어 해당 위치가 유효한지 확인합니다. 위치가 유효하면 getLongitude(), getLatitude()getAltitude()를 각각 호출하여 경도, 위도 및 고도에 대한 좌표를 검색합니다. StringBuffer 클래스의 인스턴스를 만들고 결과 좌표를 버퍼에 추가합니다. updateLocationScreen()을 호출하여 결과를 화면에 표시합니다.
    private class LocationListenerImpl implements LocationListener
    {
        public void locationUpdated(LocationProvider provider, Location location)
        {
            if(location.isValid())
            {
                double longitude = location.getQualifiedCoordinates()
                        .getLongitude();
                double latitude = location.getQualifiedCoordinates()
                        .getLatitude();
                float altitude = location.getQualifiedCoordinates()
                        .getAltitude();
                StringBuffer sb = new StringBuffer();
                sb.append("Longitude: ");
                sb.append(longitude);
                sb.append("\n");
                sb.append("Latitude: ");
                sb.append(latitude);
                sb.append("\n");
                sb.append("Altitude: ");
                sb.append(altitude);
                sb.append(" m");
                MultipleFixDemo.this.updateLocationScreen(sb.toString());
            }
        }
        public void providerStateChanged(LocationProvider provider, int newState)
        {
            // Not implemented
        }        
    }
  7. MainScreen 클래스를 확장하여 사용자 정의 화면의 구조를 만듭니다. 화면 생성자에서 super()를 호출하여 기본 메뉴를 만듭니다. 지침을 포함하는 메시지를 표시할 RichTextField의 인스턴스를 만듭니다. add()를 호출하여 RichTextField를 화면에 추가합니다.
    private final static class MultipleFixScreen extends MainScreen
    {
        MultipleFixScreen()
        {
            super(DEFAULT_CLOSE | DEFAULT_MENU);
            RichTextField instructions = new RichTextField(
                    "Waiting for location update...",Field.NON_FOCUSABLE);
            this.add(instructions);
        }
    } 

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