Windows Phone 7の懐中電灯

まえがき



Windows Phoneを購入し、特に活動の種類別に.NETに精通しているため、Windows Phone向けに何かを書くことにしました。 このアイデアは、Androidアプリケーション、懐中電灯、その光源がLEDフラッシュである友人によって提案されました。





最初の決定



私はmsdnを読みましたが 、すべてがシンプルに見えました。 Microsoft.Devices.PhotoCamera



オブジェクトを作成します。 デバイスがフォトフラッシュをサポートしているかどうかを確認します。 サポートしている場合は、ボタンをクリックするだけでPhotoCamera.FlashMode



を切り替えます。 リバノフが言うように:「エレメンタリー、ワトソン!」 しかし、そこにありました。



私を困惑させた最初のことは、カメラの初期化でした。 Microsoft.Devices.PhotoCamera



オブジェクトを作成するだけでは十分ではありません。 これらの目的のために、 msdnに関するすでによく知られている記事では、作成されたカメラオブジェクトのインストールがVideoBrush



ソースとして使用されます。 これは不必要な負荷であり、私には思えますが、他の方法は見つけていません(読者の誰かが教えてくれるかもしれません)。 ちなみに、別の目標が私を動かしたので、私はきつく見えませんでした。



しかし、2番目のポイントは、説明されたソリューションを当惑させました。 その結果、ボタンを押すだけで、ディスプレイが強調表示され、LEDフラッシュが機能しなくなります。 まあ、悲しみ。





第二の解決策



私たちはさらに掘り始めます...マイクロソフトの人たちが未開拓の人々(ここに悪党がいます)からいくつかのアセンブリを隠したことをGoogleから知って驚きました。



codeprojectで職人を見つけました。 彼らはwho索好きな目から隠された機能を使ってWP7カメラをハッキングしました。 しかし、投稿自体は、一般的な使用のために提供するリンクほど興味深いものではありません。 アイデアは、 Tomのブログで説明されているように、必要なアセンブリを使用可能にし、強調表示に使用することです。ClarityConsulting Blogの Microsoft.Devices.VideoCamera



アドバイスしていMicrosoft.Devices.VideoCamera









実装



情報は十分すぎるので、ビジネスに取り掛かりましょう。 トムのブログでは、エミュレータBINから必要なビルドを取得するか、独自のダンプをダウンロードするのが最も簡単であると述べています 。 「エミュレータBIN」とは何なのか理解できず、長い間気にしませんでした。その経験を活かしました。 アーカイブからGAC_Microsoft.Phone.Media.Extended_v7_0_0_0_0_cneutral_1.dllを取得し、次回このアセンブリにリンクを追加しやすくするために、フォルダー「 C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ Silverlight \ v4にコピーします.0 \ Profile \ WindowsPhone71 "(管理者権限が必要) Microsoft.Phone.Media.Extended.dllという名前。 当然のことながら、異なるパーティションにOSを持っている人や64ビットではない人には、わずかな違いがあります。

次に、 RedistListという名前のフォルダーを開き(コピーしたファイルと同じディレクトリにあります)、 FrameworkList.xmlファイルがその中にあります。 編集する必要があります(特定のアクセス権を持つフォルダーに対して、スポットライトで行いました)。 たとえば、 AssemblyName = "Microsoft.Phone.Interop"の場合、任意のFileノードをコピーし、新しくコピーしたPublicKeyTokenノードでそれを削除し、AssemblyNameをMicrosoft.Phone.Media.Extendedに変更します

ここで、Visual Studioコマンドプロンプトを開き、 sn -Vr Microsoft.Phone.Media.Extended.dll



コマンドsn -Vr Microsoft.Phone.Media.Extended.dll



を実行する必要がありsn -Vr Microsoft.Phone.Media.Extended.dll



。そうしないと、このアセンブリでプロジェクトをビルドするときにエラーが発生します。





ここで、最良の部分はアプリケーションの作成です。 WP7用の通常のSilverlightプロジェクトを作成し、 Microsoft.Phone.Media.Extendedアセンブリを追加するだけです。 かなりシンプルなマークアップがあり、ここで注目に値する唯一のものはCameraVisualizerコントロールで、カメラからキャプチャされた画像を表示します(ただし、カメラオブジェクトを初期化するためにのみ必要なことを覚えています)。 そして、ディスプレイ上の画像に気を取られないように、この要素を完全な不透明度に設定します。

これがマークアップです





 <phone:PhoneApplicationPage x:Class="PhoneApp1.MainPage" ... xmlns:media="clr-namespace:Microsoft.Phone;assembly=Microsoft.Phone.Media.Extended" ... shell:SystemTray.IsVisible="False"> <Grid x:Name="LayoutRoot" Background="Transparent"> <media:CameraVisualizer x:Name="_cameraVisualizer" Opacity="0" /> <Button x:Name="_btnFlash" Click="ButtonClick" IsEnabled="false"> <Button.Content> <Image VerticalAlignment="Center" HorizontalAlignment="Center" Width="300" Height="300" Source="Power_On_Off.png"/> </Button.Content> </Button> </Grid> </phone:PhoneApplicationPage>
      
      







_videoCamera.LampEnabled = true;



興味深い要因は、コード内でLEDフラッシュを使用する必要があることを示す必要があることです_videoCamera.LampEnabled = true;



そして、懐中電灯がカメラからの記録中にのみ機能し始めるという事実。 より正確には、レコード自体はそうではありません。つまり、データストリームは物理的なスペースを占有しません。





 using System.Windows; using Microsoft.Phone; namespace PhoneApp1 { public partial class MainPage { private VideoCamera _videoCamera; public MainPage() { InitializeComponent(); } protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); InitializeCamera(); } protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedFrom(e); _videoCamera.Dispose(); _videoCamera = null; } private void InitializeCamera() { _videoCamera = new VideoCamera(); //    _videoCamera.Initialized += VideoCameraInitialized; _cameraVisualizer.SetSource(_videoCamera);//    } void VideoCameraInitialized(object sender, System.EventArgs e) { _videoCamera.Initialized -= VideoCameraInitialized; _videoCamera.LampEnabled = true; //   !!! Dispatcher.BeginInvoke(() => { _btnFlash.IsEnabled = true; }); } private void ButtonClick(object sender, RoutedEventArgs e) { //   ,  .   ,  . if (_videoCamera.IsRecording) _videoCamera.StopRecording(); else _videoCamera.StartRecording(); } } }
      
      







PS:最初のトピックと私のプレゼンテーションスタイルに対する建設的な批判は大歓迎です。



使用したソース



1 msdn

2 codeproject

3 トムのブログ

4 Clarity Consulting Blog

5 xda-developers





UPDご列席の皆様 、私は誰かがその記事を好きで、誰かが気に入らなかったことを完全によく理解しています。 しかし、一般的に投稿に前向きな姿勢を持っているが、特定の点についてコメントを持っている人だけがPMで書いてください。 私たちは親切にリクエストします-あなたがマイナスであれば、気に入らないレビューを残してください。 最初の段階で自分が間違っていることを理解することが重要です。



All Articles