酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows Phoneでアセンブリのバージョンを取得する

Reflectionを使って現在実行中のアセンブリの名前を取得します。

アセンブリの名前からSystem.Reflection.AssemblyNameオブジェクトを生成し、VersionプロパティからSystem.Version型のバージョン情報を取得します。

// アセンブリ名を取得
var nameHelper = new System.Reflection.AssemblyName(
    System.Reflection.Assembly.GetExecutingAssembly().FullName);
// バージョンを取得
var version = nameHelper.Version;

「major.minor」の形式でバージョンを取得する

System.Version型には、Majorプロパティ、Minorプロパティをstringで取得することが出来ますので、string.Formatメソッドでフォーマットします。

// アセンブリ名を取得
var nameHelper = new System.Reflection.AssemblyName(
    System.Reflection.Assembly.GetExecutingAssembly().FullName);
// バージョンを取得
var version = nameHelper.Version;
            
// {major}.{minor}の形式にフォーマットする
var verStr = string.Format("{0}.{1}", version.Major, version.Minor);

Windows PhoneでVibrateControllerクラスを使ってバイブレーションを制御する

Windows PhoneではVibrateControllerクラスを使ってバイブレーターを制御することができます。

バイブレートを開始する

// 700ミリ秒後にバイブレーションを開始する
VibrateController.Default.Start(TimeSpan.FromMilliseconds(700));

バイブレートを終了する

// バイブレーションを停止する
VibrateController.Default.Stop);

参照

Windows PhoneでGeoCoordinateWatcher(GPS/位置情報測位)クラスを使って位置情報を取得する

概要

Windows Phone Location Serviceへアクセスする手段を提供してます。

Windows Phone 7.5("Mango"アップデート)からはWindows Phone エミュレータの標準機能としてGPSシミュレータが付きますが、それ以前の開発環境では「GPSをエミュレートする」を参考にして頂きながら、PC上での試験をおこなうようにするとテストがスムーズかもしれません。

名前空間:System.Device.Location

  • System.Object
    • System.Device.Location.GeoCoordinateWatcher

Tips

位置情報を取得する

取得したロケーションサービス(位置情報を扱う仕組み)のデータを、以下の様なUIで表示させてみましょう。一番上からロケーションサービスのステータス、緯度(latitude)、経度(longitude)の値を表示させています。

f:id:ch3cooh393:20141113133712p:plain

System.Device.Location名前空間のクラスを使用して位置情報を取得します。参照の追加ダイアログにて「System.Device」を参照しておきます。更にusingディレクティブに追加しておきましょう。

using System.Device.Location; // for Location Service
using System.Windows;
using Microsoft.Phone.Controls;
using System.Windows.Navigation;

GPSデバイスから取得した位置情報をアプリケーションで受け取るにGeoCoordinateWatcherクラスを使用します。

下記のサンプルコードではページ遷移後にOnNavigatedToメソッドが実行され、GeoCoordinateWatcherインスタンスの生成をおこない、位置情報の取得を開始します。

物理的なセンサーデバイスからの入力を受け取るため、位置情報を取得するのは殆どのケースでは1秒未満に位置情報が取得できますが、取得が遅い場合1分掛かることも有り得ます。

高精度で位置情報を取得したい場合はコンストラクタ引数にGeoPositionAccuracy.Highを指定しています。精度は低くても測定速度を上げたい場合はGeoPositionAccuracy.Defaultを指定します。

namespace GeoCoordinateWatcherTest {
    public partial class MainPage : PhoneApplicationPage {
        // コンストラクター
        public MainPage() {
            InitializeComponent();
        }

        GeoCoordinateWatcher watcher;

        // ページ遷移されてきた時に呼び出される
        protected override void OnNavigatedTo(NavigationEventArgs e) {
            
            // GeoCoordinateWatcherのインスタンスを生成する
            // Highを指定すると高精度で位置測定する
            watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
            // 精度よりも測定速度を優先する場合はDefaultを指定する
            //watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default);

            // 位置が変更されたことを判定する最短距離(単位:メートル)
            watcher.MovementThreshold = 20;

            // 位置が変更された時に発生するイベントハンドラを追加
            watcher.PositionChanged += watcher_PositionChanged;

            // ロケーションサービスの状態変化時に発生するイベントハンドラを追加
            watcher.StatusChanged += watcher_StatusChanged;

            // データの取得を開始する
            watcher.Start();
        }

以上で位置情報の取得を開始します。ロケーションサービスのステータス変更イベント、位置が変更したイベントの取得の仕方について後述します。

ロケーションサービスの状態が変化された時のイベント

ロケーションサービスの状態が変化するとStatusChangedイベントが発生します。ここではイベントハンドラで状態を受け取り、TextBlockコントロールに日本語で説明を表示させています。

TextBlockの値を変更するにはUIスレッドからおこなう必要があります。ただ、GeoCoordinateWatcherからのイベントは別のスレッドから返ってくる為、BeginInvokeメソッドを使ってUIスレッド上で非同期に実行しています。

// 状態が変更された場合に呼ばれるイベントハンドラ
void watcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e) {
    
    // TextBlockの値を変更したいのでUIスレッド上で実行させる
    Deployment.Current.Dispatcher.BeginInvoke(() => {

        // ステータスの内容によって表示する文言を変更する
        switch (e.Status) {
            case GeoPositionStatus.Initializing:
                labelStatus.Text = "初期化中";
                break;
            case GeoPositionStatus.Ready:
                labelStatus.Text = "動作中";
                break;
            case GeoPositionStatus.NoData:
                labelStatus.Text = "動作中だが、位置情報が取得できていない";
                break;
            case GeoPositionStatus.Disabled:
                labelStatus.Text = "非サポートか無効にされています";
                break;
        }
    });
}

移動して位置情報が変更された時のイベント

前回測位した位置より移動し、MovementThresholdプロパティに設定した最短距離以上移動した場合にPositionChangedイベントが発生します。ここではイベントハンドラで位置情報を受け取り、TextBlockコントロールに整形された値を表示しています。

こちらのイベントも別スレッドで通知される為、BeginInvokeメソッドを使用しています。

// 位置情報が変更された場合に呼ばれるイベントハンドラ
void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) {

    // TextBlockの値を変更したいのでUIスレッド上で実行させる
    Deployment.Current.Dispatcher.BeginInvoke(() => {
        
        double latitude = e.Position.Location.Latitude;
        double longitude = e.Position.Location.Longitude;

        labelLatitude.Text = string.Format("{0:0.0000}", latitude);
        labelLongitude.Text = string.Format("{0:0.0000}", longitude);
    });
}

参照

関連記事

Windows PhoneでWebBrowserコントロールで指定したページへ遷移する

WebBrowserコントロールにて、「http://ch3cooh.jp/」など指定したページを見たい場合、SourceプロパティにUriオブジェクトを設定します。またプログラム上では、Navigateメソッドを使ってページ遷移を行うことも出来ます。

XAMLで指定する方法

XAMLだけで完結させる場合は、以下のように書くことが出来ます。SourceプロパティにURLを指定しています。ここでは静的な文字列を指定していますが、データバインディングさせることももちろん可能です。

    <phone:WebBrowser Name="webBrowser1" Source="http://ch3cooh.jp/" />

プログラム上で指定する方法

プログラム上で指定する場合についてもご紹介します。XAML側でWebBrowserコントロールを配置しておきます。ここではSourceプロパティを指定していないのに注目してください。

    <phone:WebBrowser Name="webBrowser1" />

Uriオブジェクトを生成し、Sourceプロパティに対して設定します。これでページ遷移が行われます。

  webBrowser1.Source = new Uri("http://ch3cooh.jp/");

もしくは、Navigateメソッドを使用する方法もあります。以下のように指定することで、ページ遷移を行います。

  webBrowser1.Navigate(new Uri("http://ch3cooh.jp/"));

参照

TiltEffectを使ってボタンやコントロールが押された時にエフェクトをつける

Windows Phone 7は静電容量式のタッチパネルを採用しています。静電容量式のタッチパネルはハードウェアボタンと違い、例えばボタンを押していてもユーザーは押している感覚がありません。

HTCの端末ではBackキーや検索キーを押下した時にはバイブされます。Silverlight for Windows Phone ToolkitのTiltEffectを使ってユーザーへタップした感覚をエフェクトを使ってフィードバックします。

参照

Windows Phoneでシステムトレイの表示を変更する

Windows Phone OS 7.1以降対応のものに関しては、WP7.1~と表示します。

システムトレイの表示を変更する

システムトレイを表示する/非表示にする

システムトレイの表示/非表示を切り替えるには2通りの方法があります。まず1つ目にSystemTrayクラスのIsVisibleプロパティに「false」を指定する方法。

  SystemTray.IsVisible = false;

2つ目にはSetIsVisibleメソッドを使って非表示にする方法があります。

protected override void OnNavigatedTo(
    System.Windows.Navigation.NavigationEventArgs e)
{
    // システムトレイを非表示にする
    SystemTray.SetIsVisible(this, false);
}

システムトレイの背景色を変更する(WP7.1~)

protected override void OnNavigatedTo(
    System.Windows.Navigation.NavigationEventArgs e)
{
    SystemTray.SetBackgroundColor(this, Colors.Purple);
}

システムトレイの文字色を変更する(WP7.1~)

protected override void OnNavigatedTo(
    System.Windows.Navigation.NavigationEventArgs e)
{
    SystemTray.SetForegroundColor(this, Colors.Yellow);
}

システムトレイを透明にする(WP7.1~)

システムトレイを透明にすることができます。SystemTrayクラスのSetOpacityメソッドにて非透過度(0に近いほど透明に近づく)を0にして、背景色も「Colors.Transparent」を設定して完全に透明にしてしまいます。

protected override void OnNavigatedTo(
    System.Windows.Navigation.NavigationEventArgs e)
{
    // システムトレイを透明にするには非透過度を0%にして背景色を透明にする
    SystemTray.SetOpacity(this, 0.0);
    SystemTray.SetBackgroundColor(this, Colors.Transparent);
}

参考

Windows Phoneについて

3/15に米ラスベガスで開催されたWeb開発者とWebデザイナー向けのカンファレンス「MIX10」において、Microsoftは最新プラットフォームの「Windows Phone 7 Series」を発表しました。

f:id:ch3cooh393:20100315140420j:plain

初日に行われた基調講演の中で、「Windows Phone 7 Series」における開発プラットフォームについての詳細を初めて公の場で発表しました。セッションでは実際に試作機を使ったデモが行われました。

特徴的なホーム画面

現行機種のWindows Mobileと比較して、大きく変わっているのが特徴的なホーム画面ではないでしょうか。また、代表的なスマートフォンであるiPhoneやAndroidとも、一線を画するデザインであるのがご理解頂けるかと思います。

同じホーム画面を比べてみましょう。スタート画面には従来のTodayアプリケーションは存在せず、変わりにリアルタイムでコンテンツの確認が可能なライブタイルと呼ばれる「タイル」が特徴的です。

f:id:ch3cooh393:20100212155625j:plain

タイル

スタート画面には従来のTodayアプリケーションは存在せず、変わりにリアルタイムでコンテンツの確認が可能なライブタイルと呼ばれる「タイル」を見ます。

例えば、友人がFacebookなどのソーシャルサービスに投稿した日記や、写真を一目で確認することができるのです。

Windows Phone 7 Seriesのもうひとつ特徴として、人々のタスクや行動をサポートする「Windows Phone hubs」という機能があります。6つのテーマによって分類された「ハブ」は、関連するWebサイトやアプリケーションを1つの共通したタスクとしてまとめることができます。

Peopleハブ

ソーシャルネットワークサービスでの記事など登録した人に関するコンテンツを集め、FacebookやWindows Liveへの投稿をワンステップで行うことを可能にした「People」。

f:id:ch3cooh393:20100212155318j:plain

Picturesハブ

ソーシャルネットワークサービスでの写真やビデオの共有を可能とした「Pictures」。

f:id:ch3cooh393:20100212155454j:plain

Music+Videosハブ

携帯マルチメディアプレーヤーZuneのサブセットを搭載し、PC上のコンテンツを聴いたり見たりできます。楽曲再生機能や音楽配信サービス、内臓のFMラジオを一体化させた「Music+Videos」

f:id:ch3cooh393:20100212154553j:plain

Gamesハブ

Xboxで作ったアバターを持ち歩くことができます。高性能なGPUにより、Xbox Liveのゲームや、アバター、実績を携帯電話上で楽しむことができる「Games」

f:id:ch3cooh393:20100224190946j:plain

Marketplaceハブ

Windows Phone 7 Seriesに対応したアプリケーションやゲームを入手することができる「Marketplace」

f:id:ch3cooh393:20100315102933j:plain

Officeハブ

外出時の移動中でもOneNoteやSharePointにアクセスし、ドキュメントの閲覧、編集、共有が可能な「Office」

f:id:ch3cooh393:20100212155013j:plain

Windows Phone 7 Seriesのハードウェアスペック

Windows Mobile端末はAndroid端末と状況的によく似ており、解像度やカメラの制御など各端末メーカーの「色」が非常に強く表面に出ており、ハードウェア周りでは端末間にほぼ互換性がありませんでした。

例えば、液晶サイズ(解像度)からボタンの数や役割など、なんらかのデバイスが搭載されていても、各メーカーが独自で実装したドライバを使って動いているので同じコードで動かなかったりするのが現実でした。

Windows Phone 7 Seriesでは、搭載するデバイスのガイドラインが定められ、ハードウェアを使ったアプリケーション開発が容易になるように共通化されています。それに伴いiPhoneやAndroidといったスマートフォンと同等かそれ以上のハードウェアスペックとなっています。

  • 4点以上認識出来るWVGA(800x480)サイズの静電容量液晶
  • 1GHz ARM v7 "Cortex/Scorpion" かそれ以上のCPU
  • DirectX9のレンダリングが可能なGPU
  • 256MB以上のRAMと8GB以上のストレージ
  • 加速度センサ、地磁気センサ(電子コンパス)、環境光センサ、短距離近接センサ、アシストGPSのデバイスの搭載
  • 5メガピクセルのLEDフラッシュ付きカメラ
  • FMラジオチューナー
  • 「戻る」「ホーム」「検索」ボタンと「カメラ」「電源(スリープ)」ボタン、「音声ボリューム」ボタン

Windows CE 5.0までは32MBに制限されていた各プロセスの仮想アドレス空間が、Windows CE 6.0では2GBに拡張され、よりリッチなアプリケーションの作成が可能になりました。

Windows Phone 7 Series 開発者向けの無償ツールの公開

開発者にとって嬉しい話題です。Microsoftはアプリケーションの拡充を図るため、Windows Phone 7 Series向けのアプリケーション開発支援のため、「Visual Studio 2010 Express for Windows Phone」と呼ばれる開発ツールパッケージを公開しました。

このパッケージ単体でXNAやSilverlightを使った開発が可能ですが、「Expression Blend for Windows Phone Community Technology Preview」と併用することでデザイン性にすぐれたSilverlightアプリケーションを作成することができます。