Windows Phone Camera 初期化、DIspose


環境 Windows Phone 7 / Nokia Lumia 800

Windows Phone の PhotoCameraでは、初期化、解放を正しい手順で行わないと、カメラのプレビューページから、別のページ移動したあと、再びプレビューページに戻ってきた時に、ブラックアウトしてしまう場合があります。

public static PhotoCamera cam = null;

#region Add/Remove PhotoCamera Event Handler
private void AddCameraButtonEvents()
{
    // Add Camera Events
    cam.Initialized += new EventHandler<CameraOperationCompletedEventArgs>(cam_Initialized);
    cam.AutoFocusCompleted += new EventHandler<CameraOperationCompletedEventArgs>(cam_AutoFocusCompleted);
    cam.CaptureImageAvailable += new EventHandler<ContentReadyEventArgs>(cam_CaptureImageAvailable);
    cam.CaptureStarted += new EventHandler(cam_CaptureStarted);
    cam.CaptureThumbnailAvailable += new EventHandler<ContentReadyEventArgs>(cam_CaptureThumbnailAvailable);
    cam.CaptureCompleted += new EventHandler<CameraOperationCompletedEventArgs>(cam_CaptureCompleted);
 
    // Add Camara Button Events
    CameraButtons.ShutterKeyHalfPressed += new EventHandler(CameraButtons_ShutterKeyHalfPressed);
    CameraButtons.ShutterKeyPressed += new EventHandler(CameraButtons_ShutterKeyPressed);
    CameraButtons.ShutterKeyReleased += new EventHandler(CameraButtons_ShutterKeyReleased);
}

private void RemoveCameraEvents()
{
    // Remove Events
    cam.Initialized -= cam_Initialized;
    cam.AutoFocusCompleted -= cam_AutoFocusCompleted;
    cam.CaptureStarted -= cam_CaptureStarted;
    cam.CaptureImageAvailable -= cam_CaptureImageAvailable;
    cam.CaptureThumbnailAvailable -= cam_CaptureThumbnailAvailable;
    cam.CaptureCompleted -= cam_CaptureCompleted;

    // Remove CameraButtonEvents
    CameraButtons.ShutterKeyHalfPressed -= CameraButtons_ShutterKeyHalfPressed;
    CameraButtons.ShutterKeyPressed -= CameraButtons_ShutterKeyPressed;
    CameraButtons.ShutterKeyReleased -= CameraButtons_ShutterKeyReleased;
}
#endregion

#region OnNavigatedTo/From
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    if (cam == null)
    {
        cam = new PhotoCamera(CameraType.Primary);
        AddCameraButtonEvents();
        viewfinderBrush.SetSource(cam);
    }
}

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedFrom(e);

    ((App)CameraTF.App.Current).camCapabilities.Initialize(cam);

    if (cam != null)
    {
        RemoveCameraEvents();
        if (cam.IsFocusAtPointSupported)
        {
            RemoveAtPointFocusEvents();
        }
        cam.Dispose();
        cam = null;
    }
}
#endregion

・・・

using System.Windows;
using System.Collections.Generic;
using Microsoft.Devices;
using System.Linq;

namespace CameraTF
{
    public class CameraCapabilities
    {
        public IEnumerable<Size> Resolutions = null;
        public Dictionary<FlashMode, bool> FlashModeSupported = new Dictionary<FlashMode, bool>();
        public Size Resolution = Size.Empty;
        public bool IsFocusAtPointSupported = false;
        public bool IsFocusSupported = false;
        public FlashMode CurrentFlashMode = FlashMode.Auto;
        public CameraType CameraType = CameraType.Primary;
        public double Orientation = 0f;
        bool initialized = false;

        public void Initialize(PhotoCamera cam)
        {
            if (initialized)
                return;

            initialized = true;
            Resolutions = cam.AvailableResolutions;

            IsFocusSupported = cam.IsFocusSupported;
            IsFocusAtPointSupported = cam.IsFocusAtPointSupported;
            CameraType = cam.CameraType;
            Orientation = cam.Orientation;

            FlashModeSupported.Add(FlashMode.Auto, cam.IsFlashModeSupported(FlashMode.Auto));
            FlashModeSupported.Add(FlashMode.Off, cam.IsFlashModeSupported(FlashMode.Off));
            FlashModeSupported.Add(FlashMode.On, cam.IsFlashModeSupported(FlashMode.On));
            FlashModeSupported.Add(FlashMode.RedEyeReduction, cam.IsFlashModeSupported(FlashMode.RedEyeReduction));
       }
    }
}

コメント / トラックバック2件 to “Windows Phone Camera 初期化、DIspose”

  1. IKE-01 (@shogouki3) Says:

    イベントハンドラを追加するとき、new EventHander…で追加すると、解除するとき違うハンドラとして認識されそうですが大丈夫なんでしょうか?

  2. 宇宙仮面 Says:

    実装する際に、 += タブキー タブキーと打つと、自動的に new でコードが生成されてとても楽なので、いつも += new EventHandler で書いていますが、ちょっと気になったので調べてみました。

    += new EventHandler の場合の ILDASMの結果
    .method private hidebysig instance void button1_Click(object sender,
    class [mscorlib]System.EventArgs e) cil managed
    {
    // コード サイズ 2 (0x2)
    .maxstack 8
    IL_0000: nop
    IL_0001: ret
    } // end of method Form1::button1_Click

    += 直接記述 の場合の ILDASMの結果
    .method private hidebysig instance void button2_Click(object sender,
    class [mscorlib]System.EventArgs e) cil managed
    {
    // コード サイズ 2 (0x2)
    .maxstack 8
    IL_0000: nop
    IL_0001: ret
    } // end of method Form1::button2_Click

    となり、生成されるアセンブリは同じでした。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中


%d人のブロガーが「いいね」をつけました。