Archive for 2012年9月

Windows Phone を Zune で接続すると Windows 8 がクラッシュする場合の対処方法

2012年9月30日

環境: Windows 8 Pro + zune + Windows Phone 7.1 (Nokia Lumia 800) + Visual Studio 2012 + Visual Studio 2010 + Windows Phone SDK 7.1

数日前から、次のように Windows 8 がクラッシュするようになりました。原因は不明。

  1. Windows Phone をUSBで接続
  2. zune が自動的に起動する
  3. 数秒~数分でメイン画面がブラックアウト
  4. その他画面も反応なし
  5. 数秒程度、Windows が再起動する

zune を再インストールしてもダメ、Windows Phone USB ドライバーを再インストールしてもダメ。

次の方法をとってもダメでした。

http://support.microsoft.com/kb/2410177/ja#C00D1193

  1. Zune ソフトウェアを閉じます。
  2. %userprofile%\appdata\Local\Microsoft\Zune を開く
  3. ZuneStore フォルダーを探す。右クリックして名前を "ZuneStoreBackup" に変更します。

結局、次の手順でクラッシュしなくなりました。

  1. Zune を再インストール
  2. Windows Phone SDK 7.1 を修復インストール
  3. Windows Phone SDK 7.1.1 をインストール

Path を回す

2012年9月27日

環境: Windows Phone 7

デザイナーでアニメーションを設定するのは簡単ですが、固定パターンしかアニメーションを設定できません。動的にアニメーションを作成するには、次のような方法でオブジェクトにアニメーションを設定して、ストーリーボードを再生する必要があります。この時、試行錯誤をしたので、その時のメモです。

ポイント1:
SetTarget で、CompositeTransform に名前を付けて、それに対して、アニメーションのターゲットを設定します。
この時、SetTargetName(daukf1, “ct”);
のように名前で指定しようとすると、InvalidOperationalException、”Cannot resolve TargetName ct” という例外が発生して、うまくいきません。SetTarget(daukf1, ct) で直接指定するとうまくいきます。指定方法が悪いのか、原因は不明です。

ポイント2:
SetTargetPropert で、 ターゲットプロパティに new PropertyPath(CompositeTransform.RotationProperty) を設定します。

<Path x:Name="path" Data="M178,173 L231,109 C231,109 278,143 279,146 C280,149 276,221 272,222 C268,223 203.00009,247 192.00006,245 C181.00002,243 178,173 178,173 z" Fill="Blue" Height="100" Stretch="Fill" Stroke="Red" RenderTransformOrigin="0.5,0.5"  Width="100">
    <Path.RenderTransform>
        <CompositeTransform x:Name="ct"/>
    </Path.RenderTransform>
</Path>

Storyboard sb1 = new Storyboard();

DoubleAnimationUsingKeyFrames daukf1 = new DoubleAnimationUsingKeyFrames();

EasingDoubleKeyFrame ldkf1 = new EasingDoubleKeyFrame();
ldkf1.KeyTime = KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0));
ldkf1.Value = 0;
EasingDoubleKeyFrame ldkf2 = new EasingDoubleKeyFrame();
ldkf2.KeyTime = KeyTime.FromTimeSpan(new TimeSpan(0, 0, 1));
ldkf2.Value = 100;

daukf1.KeyFrames.Add(ldkf1);
daukf1.KeyFrames.Add(ldkf2);

Storyboard.SetTarget(daukf1, ct);
Storyboard.SetTargetProperty(daukf1, new PropertyPath(CompositeTransform.RotationProperty));

sb1.Children.Add(daukf1);
sb1.Begin();

Storyboard の例

2012年9月25日

 

Storyboard sb1 = new Storyboard();

DoubleAnimationUsingKeyFrames daukf1 = new DoubleAnimationUsingKeyFrames();
daukf1.Duration = TimeSpan.FromSeconds(5);

EasingDoubleKeyFrame ldkf1 = new EasingDoubleKeyFrame();
ldkf1.KeyTime = KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0));
ldkf1.Value = 0;
EasingDoubleKeyFrame ldkf2 = new EasingDoubleKeyFrame();
ldkf2.KeyTime = KeyTime.FromTimeSpan(new TimeSpan(0, 0, 5));
ldkf2.Value = 100;

daukf1.BeginTime = TimeSpan.FromSeconds(0);
daukf1.Duration = TimeSpan.FromSeconds(5);
daukf1.KeyFrames.Add(ldkf1);
daukf1.KeyFrames.Add(ldkf2);

Storyboard.SetTarget(daukf1, path);
Storyboard.SetTargetProperty(daukf1, new PropertyPath(Path.WidthProperty));
          

sb1.Children.Add(daukf1);
sb1.Begin();

Windows Phone で XNA.Framework で効果音を鳴らす時の注意

2012年9月21日

環境 Windows Phone 7

5.1 .2 Application Reliability (InvalidOperation Exception) でリジェクトされましたので、その原因と対策をさらしておきます。

症状

XNA Framework で効果音を使用していた。音楽を連続再生している状態で、アプリケーションを実行していると、InvalidOperation Exception で落ちる。

原因

Windows Phone で、XNA Framework を使うと、次のような感じで簡単に効果音を鳴らすことができます。

soundPath = "sounds/abc.wav";
var soundUri = App.GetResourceStream(new Uri(soundPath, UriKind.Relative));
var sound = SoundEffect.FromStream(soundUri .Stream);
SoundEffect.MasterVolume = (float)…settings.SoundVolume;
var mySoundInstance = sound .CreateInstance();
mySoundInstance.Play();

音楽を再生した状態で、しばらくすると、次の例外メッセージで、InvalidOperation でクラッシュします。

注意しなければならないのが、音楽を再生状態で、アプリを起動しないと、クラッシュしません(たぶん)。

例外メッセージ
FrameworkDispatcher.Update has not been called. Regular FrameworkDispatcher.Update calls are necessary for fire and forget sound effects and framework events to function correctly. See http://go.microsoft.com/fwlink/?LinkId=193853 for details.

なぜテストで見つからなかったか

テストケース漏れ。

音楽再生中でないと、例外が発生しない可能性があります。また、例外発生まで、多少の時間がかかる場合があるようです。このため、音楽の再生、停止を繰り返しながら、ある程度の時間アプリを操作し続けるというテストが必要だとおもいます。

いつもは、Walkman やPCで音楽を聴いていたので、Windows Phone で音楽を聴きながら、アプリを操作するというテストケースが、完全に頭から抜けていました。

Windows Phone の審査では、音楽を再生中に、アプリケーションが勝手に音楽再生を停止しないという基準がありますが、そのテストケースに加えて、音楽の連続再生中に、ある程度の時間アプリを操作するというテストケースも必要です。

対策

Windows Phone アプリケーションでの XNA Framework イベントの有効化

にあるように、Game クラスを実装していないアプリケーション
(たとえば Silverlight アプリケーション モデルを使用する Windows Phone アプリケーション、具体的には上記効果音を鳴らすだけのために XNA を呼んだ場合)から、
XNA Framework を使用する場合は、自身で FrameworkDispatcher.Update メソッドを呼び出して、XNA Framework メッセージ キュー内にあるメッセージをディスパッチする必要があります。

具体的には、次の App.xaml に、

xmlns:s="clr-namespace:MyAppNameSpace;assembly=MyAppNameSpace"


<Application.ApplicationLifetimeObjects>
    <!–アプリケーションのライフタイム イベントを処理する必須オブジェクト–>
    <shell:PhoneApplicationService
        Launching="Application_Launching" Closing="Application_Closing"
        Activated="Application_Activated" Deactivated="Application_Deactivated"/>
    <s:XNAFrameworkDispatcherService />
</Application.ApplicationLifetimeObjects>

次の XNAUpdate.cs を追加。MyAPpNameSpace は、プロジェクトに合わせて変更。

using System;
using System.Windows;
using System.Windows.Threading;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework;

namespace MyAppNameSpace
{
    public class XNAFrameworkDispatcherService : IApplicationService
    {
        private DispatcherTimer frameworkDispatcherTimer;

        public XNAFrameworkDispatcherService()
        {
            this.frameworkDispatcherTimer = new DispatcherTimer();
            this.frameworkDispatcherTimer.Interval = TimeSpan.FromTicks(333333);
            this.frameworkDispatcherTimer.Tick += frameworkDispatcherTimer_Tick;
            FrameworkDispatcher.Update();
        }

        void frameworkDispatcherTimer_Tick(object sender, EventArgs e) { FrameworkDispatcher.Update(); }

        void IApplicationService.StartService(ApplicationServiceContext context)
        {
            this.frameworkDispatcherTimer.Start();
        }

        void IApplicationService.StopService()
        {
            this.frameworkDispatcherTimer.Stop();
        }

    }
}

参考

あと、Zuneで接続しているときには、写真や音楽系のデバッグができませんが、その回避方法など。

秋コン:実質5行で作るMusicPlayer