Windows Phoneアプリケーション開発入門

第33回Mangoで追加されたLancherとChooserを使ってみよう!

はじめに

Windows Phone SDK 7.1 Beta 2がリリースされました。⁠Windows Phone Developer Tools」の名称で配布されていましたが、今回から名称が「Windows Phone SDK」に変更となりました。

変更されたのは実質名前だけですので、インストール方法やインストールに関しての注意点等は、連載第11回第31回のWindows Phone Developer Toolsの方法を参照していただければと思います。

画像

Windows Phone SDK 7.1 Beta2にて配布されています。このWindows Phone SDK 7.1 Beta2でインストールされるツールは以下の通りです。

  • Windows Phone SDK 7.1(Beta2)
  • Windows Phone Emulator(Beta2)
  • Windows Phone SDK 7.1 Assemblies(Beta2)
  • Silverlight 4 SDK and DRT
  • Windows Phone SDK 7.1 Extensions for XNA Game Studio 4.0
  • Microsoft Expression Blend SDK Preview for Windows Phone 7.1
  • WCF Data Services Client for Window Phone 7.1
  • Microsoft Advertising SDK for Windows Phone 7

新規で「Microsoft Advertising SDK for Windows Phone 7」が追加されました。今までに別途配布されていた広告表示用のSDKが開発ツールに同梱されるようになったイメージです。

過去の開発ツールと同様に、インターネットに繋がっていない場合や、回線速度が遅い方向けにCDイメージ(.ISO)でもインストーラが公開されています。何度もやり直すことを考えるとISOファイルをダウンロードしてきたほうがよいかもしれません。

AppHubの登録者を対象に、開発者向け早期評価プログラムが開始されました。NoDo(Build 7.0.7390.0 または 7.0.7392.0)へのアップデート済みの実機を持っている開発者、かつAppHubからの招待メールを受信した方はMango Betaへアップデートすることが可能です。

ただし、開発中の製品を扱うことになりますので、Microsoft Connect経由で秘密保持義務契約を結ぶ必要があります。Microsoft Connectへの参加条件を確認してください。

一部、技術解説のためにスクリーンショットを撮影しています。これはMango Betaでのスクリーンショットであるため、サンプルアプリケーションから起動されるLauncherとChooser画面に関しても開発中のものです。よって、予告なくUIが変更される可能性がありますのであらかじめご了承ください。

Windows Phone OS 7.1で追加されたLauncherとChooser

本連載でも第25回第26回第27回に掛けてWindows Mobile 6.xと比較しながらLauncherとChooserの紹介をさせて頂きました。今回は、⁠Mango⁠にて追加されるLauncherとChooserを紹介いたします。

画像

サンプルアプリはこちらからダウンロードしてください。今回ご紹介するTaskは以下の通りです。

  • BingMapsTask
  • BingMapsDirectionsTask
  • GameInviteTask
  • SaveContactTask
  • ShareLinkTask
  • ShareStatusTask

BingMapsTask

Windows Phone OS 7.1で追加されたLauncherです。BingMapsTaskは、Bing Mapsアプリケーションを起動することができます。最も簡単な使用例としては、SearchTermプロパティに地図上の位置をマークするための地名等を設定した上で、Showメソッドを呼びます。

ZoomLevelプロパティをあらかじめ指定しておくと、最初にマップが表示されるときに表示されるズームレベルを指定することができます。

Centerプロパティは表示されるマップの中心点を設定することができます。Centerプロパティを設定しない場合、ユーザーの現在位置が地図の中心点として使用されます(下の例では、Centerプロパティへの設定をコメントアウトをしています⁠⁠。

private void btnBingMaps_Click(object sender, RoutedEventArgs e)
{
    // SearchTermプロパティに検索用テキストに設定して表示を行う
    var bingMapsTask = new BingMapsTask();
    bingMapsTask.SearchTerm = "Ichikawa, Japan";
    bingMapsTask.ZoomLevel = 10;
    // bingMapsTask.Center = new GeoCoordinate(35.691356, 139.690046);
    bingMapsTask.Show();
}
Private Sub btnBingMaps_Click(sender As Object, e As RoutedEventArgs)
    ' SearchTermプロパティに検索用テキストに設定して表示を行う
    Dim bingMapsTask = New BingMapsTask()
    bingMapsTask.SearchTerm = "Ichikawa, Japan" 
    bingMapsTask.ZoomLevel = 10
    ' bingMapsTask.Center = new GeoCoordinate(35.691356, 139.690046);
    bingMapsTask.Show()
End Sub

上記のコードを実行した際のスクリーンショットです。⁠Ichikawa, Japan」で検索を行いラベルが付いているのが判ると思います。左側にあるピンク色のマーカーはユーザーの現在地を示しています。

画像

必要に応じて、表示されるマップの中心点を設定することができます。Centerプロパティに都庁の座標を設定しています。

中心点は、GeoCoordinateオブジェクトを使用して指定されます。利用するにはプロジェクトにSystem.Deviceアセンブリへの参照を追加します。GeoCoordinate APIにアクセスするには、System.Device.Location名前空間を参照するusingディレクティブを含める必要があります。

private void btnBingMaps_Click(object sender, RoutedEventArgs e)
{
    BingMapsTask bingMapsTask = new BingMapsTask();
    bingMapsTask.Center = new GeoCoordinate(35.691356, 139.690046);
    bingMapsTask.ZoomLevel = 15;
    bingMapsTask.Show();
}
Private Sub btnBingMaps_Click(sender As Object, e As RoutedEventArgs)
    Dim bingMapsTask As New BingMapsTask()
    bingMapsTask.Center = New GeoCoordinate(35.691356, 139.690046)
    bingMapsTask.ZoomLevel = 15
    bingMapsTask.Show()
End Sub

上記のコードを実行した際のスクリーンショットです。都庁が地図上の中心に表示されています。

画像

SearchTermプロパティとCenterプロパティを両方とも設定した場合は、一旦Centerプロパティに指定した位置へ移動してから、SearchTermプロパティの検索結果の場所へ移動するような挙動となりました。

private void btnBingMaps_Click(object sender, RoutedEventArgs e)
{
    // SearchTermプロパティにテキストに設定して、
    // Centerプロパティに地図上で中央になる座標を設定している場合、
    // SearchTermプロパティが優先されて表示される
    BingMapsTask bingMapsTask = new BingMapsTask();
    bingMapsTask.SearchTerm = "Ichikawa, Chiba, Japan";
    bingMapsTask.Center = new GeoCoordinate(35.691356, 139.690046);
    bingMapsTask.Show();
}
Private Sub btnBingMaps_Click(sender As Object, e As RoutedEventArgs)
    ' SearchTermプロパティにテキストに設定して、
    ' Centerプロパティに地図上で中央になる座標を設定している場合、
    ' SearchTermプロパティが優先されて表示される
    Dim bingMapsTask As New BingMapsTask()
    bingMapsTask.SearchTerm = "Ichikawa, Chiba, Japan" 
    bingMapsTask.Center = New GeoCoordinate(35.691356, 139.690046)
    bingMapsTask.Show()
End Sub

なお、BingMapsTaskの呼び出し時には、SearchTermプロパティとCenterプロパティにそれぞれ何も設定しなかった場合、InvalidOperationExceptionが発生してしまいます。

private void btnBingMaps_Click(object sender, RoutedEventArgs e)
{
    // SearchTermとCenter、両方のプロパティに何も設定しなかった場合、
    // InvalidOperationExceptionが発生する
    BingMapsTask bingMapsTask = new BingMapsTask();
    bingMapsTask.Show();
}
Private Sub btnBingMaps_Click(sender As Object, e As RoutedEventArgs)
    ' SearchTermとCenter、両方のプロパティに何も設定しなかった場合、
    ' InvalidOperationExceptionが発生する
    Dim bingMapsTask As New BingMapsTask()
    bingMapsTask.Show()
End Sub
画像

Windows Phone SDK 7.1 Beta2では、SearchTermプロパティに日本語を入力すると文字化けしてしまう現象が発生していました。正式版が出る頃には日本語でも検索できるようになっていると思われます。

BingMapsDirectionsTask

地図上に経路を表示することができます。

BingMapsDirectionsTaskクラスのインスタンスに、経路案内の開始地点であるStartプロパティと終了地点であるEndプロパティを指定して、Showメソッドを呼ぶとMapsアプリケーションを経路案内モードで起動します。

private void btnBingMapsDirections_Click(object sender, RoutedEventArgs e)
{
    var bingMapsDirectionsTask = new BingMapsDirectionsTask();

    // 開始地点のシアトル・タコマ国際空港を設定
    LabeledMapLocation start = new LabeledMapLocation();
    GeoCoordinate startLocation = new GeoCoordinate(47.443937,-122.298732);
    start.Label = "International Boulevard Seattle, WA";
    start.Location = startLocation;

    // 終了地点のマイクロソフトを設定
    LabeledMapLocation end = new LabeledMapLocation()
    {
        Label = "Microsoft",
        Location = new GeoCoordinate(47.657757,-122.142241)
    };

    bingMapsDirectionsTask.Start = start;
    bingMapsDirectionsTask.End = end;
    bingMapsDirectionsTask.Show();
}
Private Sub btnBingMapsDirections_Click(sender As Object, e As RoutedEventArgs)
    Dim bingMapsDirectionsTask = New BingMapsDirectionsTask()

    ' 開始地点のシアトル・タコマ国際空港を設定
    Dim start As New LabeledMapLocation()
    Dim startLocation As New GeoCoordinate(47.443937, -122.298732)
    start.Label = "International Boulevard Seattle, WA" 
    start.Location = startLocation

    ' 終了地点のマイクロソフトを設定
    Dim [end] As New LabeledMapLocation()
    With [end]
        .Label = "Microsoft" 
        .Location = New GeoCoordinate(47.657757, -122.142241)
    End With

    bingMapsDirectionsTask.Start = start
    bingMapsDirectionsTask.End = [end]
    bingMapsDirectionsTask.Show()
End Sub

上記のコードを実行した際のスクリーンショットです。画面の下半分にシアトル・タコマ国際空港からマイクロソフト社までの経路が表示されています。

車での経路で移動した場合の距離と大体の所要時間とが合わせて表示されているのでとても便利です。車と人のアイコンが表示されています。人を選択した場合には徒歩での経路が表示されます。

画像

GameInviteTask

GameInviteTaskは、マルチプレイヤー対応のゲームで、ユーザーが友達を招待する画面を表示させます。

private void btnGameInvite_Click(object sender, RoutedEventArgs e)
{
    var gameInviteTask = new GameInviteTask();
    gameInviteTask.SessionId = "SomeSessionID";

    Observable.FromEvent<TaskEventArgs>(
        h => gameInviteTask.Completed += h,
        h => gameInviteTask.Completed -= h)
        .Subscribe(ex =>
        {
            // ゲームの招待に成功
            if (ex.EventArgs.Error == null)
                MessageBox.Show("Invite Success!");
        });

    gameInviteTask.Show();
}
Private Sub btnGameInvite_Click(sender As Object, e As RoutedEventArgs)
    Dim gameInviteTask As New GameInviteTask()
    gameInviteTask.SessionId = "SomeSessionID" 

    Observable.FromEvent(Of TaskEventArgs)(
        Sub(h) AddHandler gameInviteTask.Completed, h,
        Sub(h) RemoveHandler gameInviteTask.Completed, h) _
    .Subscribe(Sub(ex)
                   ' ゲームの招待に成功
                   If ex.EventArgs.TaskResult = TaskResult.OK Then
                       MessageBox.Show("Save Success!")
                   End If
               End Sub)

    gameInviteTask.Show()
End Sub

上記のコードを実行した際のスクリーンショットです。

画像

SaveContactTask

SaveContactTaskは、ユーザーを連絡帳に追加することができます。

private void btnSaveContactTask_Click(object sender, RoutedEventArgs e)
{
    SaveContactTask saveContactTask = new SaveContactTask();
    saveContactTask.Company = "Softbuild";
    saveContactTask.FirstName = "Kenji";
    saveContactTask.LastName = "Wada";
    saveContactTask.MobilePhone = "090123456789";
    saveContactTask.Website = "http://ch3cooh.jp/";

    Observable.FromEvent<SaveContactResult>(
        h => saveContactTask.Completed += h,
        h => saveContactTask.Completed -= h)
        .Subscribe(ex =>
        {
            // 連絡先の保存に成功
            if (ex.EventArgs.TaskResult == TaskResult.OK)
                MessageBox.Show("Save Success!");
        });

    saveContactTask.Show();
}
Private Sub btnSaveContactTask_Click(sender As Object, e As RoutedEventArgs)
    Dim saveContactTask As New SaveContactTask()
    saveContactTask.Company = "Softbuild" 
    saveContactTask.FirstName = "Kenji" 
    saveContactTask.LastName = "Wada" 
    saveContactTask.MobilePhone = "090123456789" 
    saveContactTask.Website = "http://ch3cooh.jp/" 

    Observable.FromEvent(Of SaveContactResult)(
        Sub(h) AddHandler saveContactTask.Completed, h,
        Sub(h) RemoveHandler saveContactTask.Completed, h) _
    .Subscribe(Sub(ex)
                   ' 連絡先の保存に成功
                   If ex.EventArgs.TaskResult = TaskResult.OK Then
                       MessageBox.Show("Save Success!")
                   End If
               End Sub)

    saveContactTask.Show()
End Sub

上記のコードを実行した際のスクリーンショットです。Windows Phoneでは基本的にアドレス帳はクラウド側に保存することになります。

画像

追加を行いたいサービス(スクリーンショット上には、Windows LiveとGoogleと表示されている)からWindows Liveを選択すると、ユーザーが編集可能な連絡先の作成画面が表示されます。コード上で設定したプロパティが反映されているのが判るかと思います。

画像

設定が可能な項目は27項目あり、本記事にてすべての項目を説明することができませんので、MSDNライブラリのSaveContactTask Propertiesを参照して頂ければと思います。

ShareLinkTask、ShareStatusTask

Windows Phone OS 7.1で追加されたLauncherです。ShareLinkTaskは、ユーザーの選択したソーシャルネットワークサービスで好きなリンクを共有することができます。

Windows Phone OS 7.0の頃からWindows Live、Facebookに対応していました。⁠Mango⁠でTwitteとLinkedInにも標準で対応することが決まっています。それらSNSに対して、簡単にユーザーがリンクを共有する機能を提供します。

private void btnShareLink_Click(object sender, RoutedEventArgs e)
{
    ShareLinkTask shareLinkTask = new ShareLinkTask();
    shareLinkTask.Title = "CH3COOH(酢酸)の実験室";
    shareLinkTask.LinkUri = new Uri("http://ch3cooh.jp/", UriKind.Absolute);
    shareLinkTask.Message = "ch3cooh.jpのウェブサイトみつけた!";
    shareLinkTask.Show();
}
Private Sub btnShareLink_Click(sender As Object, e As RoutedEventArgs)
    Dim shareLinkTask As New ShareLinkTask()
    shareLinkTask.Title = "CH3COOH(酢酸)の実験室" 
    shareLinkTask.LinkUri = New Uri("http://ch3cooh.jp/", UriKind.Absolute)
    shareLinkTask.Message = "ch3cooh.jpのウェブサイトみつけた!" 
    shareLinkTask.Show()
End Sub

上記のコードを実行した際のスクリーンショットです。Titleプロパティで設定したテキストが大きく表示され、その下にLinkUriプロパティで設定したURLが表示されています。

画像

「Include a message」欄では、リンクに対するメッセージをあらかじめ設定しておくことができます。⁠Post to」欄から投稿したいサービスをチェックボックスで選択することができます。このリンクはWindows Liveでは共有したいが、Twitterでは共有したくないという場合に使えるのではないかと思います。

画像

アプリケーションバーに表示されているpostアイコンをタップすると、Windows LiveとFacebookに対してリンクの共有が行われます。Facebookでは以下のように「Windows Phoneから」の投稿として扱われるようです。

画像

ShareStatusTaskは、ユーザーのステータスをソーシャルネットワークサービス(以後、SNS)で共有することができます。ステータスを共有する場合には、ShareStatusTaskのほうを使うべきでしょう。

Statusプロパティにテキストを設定しておくと、あらかじめ起動される投稿画面にステータスが入力された状態で表示することができます。

private void btnShareStatus_Click(object sender, RoutedEventArgs e)
{
    ShareStatusTask shareStatusTask = new ShareStatusTask();
    shareStatusTask.Status = "Hello, world! こんにちは、世界!";
    shareStatusTask.Show();
}
Private Sub btnShareStatus_Click(sender As Object, e As RoutedEventArgs)
    Dim shareStatusTask As New ShareStatusTask()
    shareStatusTask.Status = "Hello, world! こんにちは、世界!" 
    shareStatusTask.Show()
End Sub

上記のコードを実行した際のスクリーンショットです。ShareStatusTaskでも「Post to」欄があり投稿するSNSを変更することができます。

画像

アプリケーションバーに表示されているpostアイコンをタップすると、SNSに対してリンクの共有が行われます。Facebookでは以下のように「Windows Phoneから」の投稿として扱われます。

画像

さいごに

iPhoneやAndrodi問わずに、スマートフォンアプリケーションではTwitterやFacebookでのへの投稿は当然のように要件として含まれてきます。

店舗や施設などのナビゲーション系のアプリケーションであれば、施設の場所を標準の地図アプリケーションで表示したり、現在地から施設への道順を表示する機能を搭載できないかと問い合わせを頂きます。

iOSも5になりTwitter APIが標準APIとして搭載されることとなりましたが、Windows Phone 7 ⁠Mango⁠では、ソーシャルネットワークサービスでのコミュニケーション機能が非常に充実しています。今まで外部ライブラリが必要であった各SNSへの共有が標準APIで用意されているのは、開発者冥利に尽きます。

“イマドキ⁠のアプリケーションで求められる機能が標準APIとして搭載されており、Taskを使うだけで実装できるのは嬉しいですね。次回もWindows Phone ⁠Mango⁠での新機能についてご紹介させて頂きたいと思います。

以上で今回は終わりです。ありがとうございました。

おすすめ記事

記事・ニュース一覧