정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8에 대한 휴대폰의 위치를 연속적으로 추적하는 방법

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1만

 

이 항목에서는 Windows Phone 위치 API를 사용하여 휴대폰의 위치를 연속해서 추적하는 방법을 설명합니다. 앱에 현재 시간의 사용자 위치만 필요한 경우(예: 특정 위치에서 사용자를 체크인하거나 위치 기반 검색을 수행하는 경우)에는 Windows Phone 8에 대한 휴대폰의 현재 위치를 가져오는 방법에 설명된 단발성 기술을 사용해야 합니다. 사용자 위치를 연속해서 추적하면 한 곳의 위치를 알아내는 것보다 배터리가 많이 소모되므로 이 정보가 필요한 앱에서만 사용해야 합니다.

중요중요:

Windows Phone 앱에서 위치 API를 사용하려면 앱 매니페스트 파일에 ID_CAP_LOCATION 기능을 포함해야 합니다. 이렇게 하지 않으면 개발하는 동안 앱을 배포할 때 앱에 예외가 발생하여 앱을 Windows Phone 스토어 로 전송할 때 앱이 통합되지 못합니다. 자세한 내용은 Windows Phone 8의 앱 기능 및 하드웨어 요구 사항을 참조하세요.

팁팁:

Windows 런타임 위치 API는 Windows Phone 8 앱과 Windows Phone 8.1 앱에서 모두 지원됩니다. 이 항목은 Windows Phone 8 설명서의 일부입니다. 이 기능에 대한 정보를 보려면 휴대폰 및 PC의 개발 정보를 포함하고 있는 Windows Phone 8.1 설명서에서 지리적 위치 검색을 참조하세요.

휴대폰의 위치를 연속적으로 추적

  1. 새 Windows Phone 앱을 만듭니다.

  2. 솔루션 탐색기에서 속성 폴더를 확장한 다음 WMAppManifest.xml을 두 번 클릭합니다.

  3. 매니페스트 디자이너의 기능 탭에서 ID_CAP_LOCATION 옆에 있는 확인란을 선택합니다.

  4. MainPage.xaml에서 “ContentPanel”이라는 기존 Grid 요소에 다음 XAML 코드를 붙여 넣습니다. 이 코드는 위치 API를 시작하고 위도, 경도 및 앱의 상태를 표시하기 위한 일부 텍스트 블록을 시작하는 버튼을 정의합니다.

    
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <StackPanel>
            <Button x:Name="TrackLocationButton" Click="TrackLocation_Click" Content="track location"/>
            <TextBlock x:Name="LatitudeTextBlock"/>
            <TextBlock x:Name="LongitudeTextBlock"/>
            <TextBlock x:Name="StatusTextBlock"/>
        </StackPanel>
    </Grid>
    
    
    
  5. MainPage.xaml.cs에서 다음 using 문을 파일의 맨 위에 추가합니다.

    
    using System.Threading.Tasks;
    using Windows.Devices.Geolocation;
    
    
    
  6. MainPage class 정의 내에서 Geolocator 개체의 변수와 앱이 능동적으로 위치를 추적하는지를 추적하는 변수를 각각 하나씩 선언합니다.

    
    Geolocator geolocator = null;
    bool tracking = false;
    
    
    
  7. 앱이 해당 위치에 액세스하는 것을 취소할 수 있도록 사용자에게 허용하는 동의 메시지를 추가합니다. 모든 앱은 위치 API를 사용하기 전에 사용자 동의를 얻어야 합니다. 이 예제에서는 앱이 시작될 때마다 호출되는 MainPage 클래스의 OnNavigatedTo(NavigationEventArgs) 메서드에서 사용자 동의를 확인합니다. 코드는 먼저 ApplicationSettings 사전에서 "LocationConsent" 키를 확인합니다. 키가 있으면 사용자가 위치를 이미 선택하거나 취소했다는 의미이므로 메서드가 바로 반환됩니다. 키가 없으면 사용자 동의를 요청하는 MessageBox가 표시됩니다. MessageBox 작업의 결과가 확인되고 사용자 동의 상태를 나타내는 부울 값이 ApplicationSettings의 "LocationConsent" 키에 저장됩니다. 이 키는 앱이 사용자의 위치에 액세스하려고 하기 전에 확인됩니다.

  8. 버튼 클릭 처리기를 MainPage.xaml.cs에 붙여 넣습니다. 이 처리기는 추적 설정/해제 상태를 전환하지만 먼저 ApplicationSettings 사전에서 "LocationConsent" 값을 확인합니다. 앱이 이전에 위치를 추적하고 있지 않은 경우에는 Geolocator 개체가 초기화됩니다. 그런 후 정확도 및 이동 임계값이 설정됩니다. 앱은 휴대폰이 이전 위치에서 이동 임계값보다 많이 이동하는 경우 새 위치 정보로만 업데이트됩니다. 다음으로, StatusChangedPositionChanged의 이벤트 처리기가 등록됩니다. 마지막으로 tracking 변수가 true로 설정되고 버튼 텍스트가 업데이트됩니다.

    앱이 이전에 위치를 추적하고 있었으면 이벤트 처리기가 추적을 해제합니다. 이렇게 하려면 StatusChangedPositionChanged 이벤트에 대한 이벤트 처리기를 제거하고 Geolocator 개체를 null로 설정합니다. 마지막으로 tracking 변수와 버튼 텍스트가 업데이트됩니다.

    
    private void TrackLocation_Click(object sender, RoutedEventArgs e)
    {
        if (!tracking)
        {
            geolocator = new Geolocator();
            geolocator.DesiredAccuracy = PositionAccuracy.High;
            geolocator.MovementThreshold = 100; // The units are meters.
    
            geolocator.StatusChanged += geolocator_StatusChanged;
            geolocator.PositionChanged += geolocator_PositionChanged;
    
            tracking = true;
            TrackLocationButton.Content = "stop tracking";
        }
        else
        {
            geolocator.PositionChanged -= geolocator_PositionChanged;
            geolocator.StatusChanged -= geolocator_StatusChanged;
            geolocator = null;
    
            tracking = false;
            TrackLocationButton.Content = "track location";
            StatusTextBlock.Text = "stopped";
        }
    }
    
    
    
  9. StatusChanged 이벤트에 대한 이벤트 처리기를 MainPage.xaml.cs로 붙여넣습니다. 이 이벤트는 위치 서비스의 상태가 변경될 때마다 발생합니다. 이 메서드를 이용해 사용자에게 피드백을 제공할 수 있습니다. 이 이벤트 처리기는 UI 스레드에서 호출되지 않으므로, BeginInvoke(Action)를 사용하여 UI를 수정하는 코드를 실행해야 합니다.

    
    void geolocator_StatusChanged(Geolocator sender, StatusChangedEventArgs args)
    {
        string status = "";
    
        switch (args.Status)
        {
            case PositionStatus.Disabled:
                // the application does not have the right capability or the location master switch is off
                status = "location is disabled in phone settings";
                break;
            case PositionStatus.Initializing:
                // the geolocator started the tracking operation
                status = "initializing";
                break;
            case PositionStatus.NoData:
                // the location service was not able to acquire the location
                status = "no data";
                break;
            case PositionStatus.Ready:
                // the location service is generating geopositions as specified by the tracking parameters
                status = "ready";
                break;
            case PositionStatus.NotAvailable:
                status = "not available";
                // not used in WindowsPhone, Windows desktop uses this value to signal that there is no hardware capable to acquire location information
                break;
            case PositionStatus.NotInitialized:
                // the initial state of the geolocator, once the tracking operation is stopped by the user the geolocator moves back to this state
    
                break;
        }
    
        Dispatcher.BeginInvoke(() =>
        {
            StatusTextBlock.Text = status;
        });
    }
    
    
    
  10. PositionChanged 이벤트에 대한 이벤트 처리기를 MainPage.xaml.cs로 붙여넣습니다. 이 이벤트는 휴대폰이 이전 위치에서 이동 임계값보다 먼 거리를 이동할 때마다 발생합니다. 역시 이 이벤트 처리기는 UI 스레드에서 호출되지 않으므로, BeginInvoke(Action)를 사용하여 UI를 수정하는 코드를 실행해야 합니다.

    
    void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
    {
        Dispatcher.BeginInvoke(() =>
        {
            LatitudeTextBlock.Text = args.Position.Coordinate.Latitude.ToString("0.00");
            LongitudeTextBlock.Text = args.Position.Coordinate.Longitude.ToString("0.00");
        });
    }
    
    
    

표시: