最高の贈り物は手作りの贈り物なので、私は愛する孫であり、モバイルプラットフォームのプログラマとして、祖母にお気に入りの音楽への簡単なアクセスを提供する方法について考え始めました。
私はすぐに成功したと言わなければなりませんが、このプロセスに興味がある人には猫をお願いします。
タスク
まず、達成したい目標の概要を説明しました。
-2つのモードを持つアプリケーションを作成する必要があります。音楽を再生し、ラジオを聴く。
-アプリケーションインターフェイスはできるだけシンプルにする必要があります。
-アプリケーションは、音楽のソースを簡単に交換できるように、メモリカードで動作する必要があります。
-ロックキーが押されない限り、アプリケーションは画面をオフにしないでください。
-アプリケーションを終了すると、音楽はオフになります。
-オーディオの再生中のアプリケーションは、写真の日付、時刻、スライドショーを表示する必要があります。
鉄の選択
オーディオスピーカー、スマートフォン用スタンド、スマートフォン自体の3つを選択する必要がありました。
ここで、先を見据えて、私の選択は非常に議論の余地があると言います。異なる特性と価格で他のモデルを購入することが可能でした。 しかし、それがどのように起こったか、それは起こりました。
最初は、スマートフォンをBluetooth経由でスピーカーに接続したかったのは、 祖母の配線が少ないほど良い。 そのため、 ノキアのMD-50Wスピーカーが選ばれました。それは非常に大きく、内蔵バッテリー、標準のマイクロUSB充電コネクター、Bluetooth、さらにはNFCを備えています。
次のように、Windows Phoneプラットフォームでスマートフォンを選択することが決定されました。 第一に、このプラットフォームでは、Androidよりも開発経験が豊富です。第二に、システムインターフェースは、インターフェースの経験がまったくない人にとって非常に簡単です。
開発は、Windows Phone 8.0用のGDR2更新プログラムがリリースされたばかりのときに行われ、ラジオサポートが追加されました。 microSDカードと明るいかなり大きな画面を備えたデバイスを見つける必要がありました。 ロシアでの1週間の検索の後、 ノキアLumia 625モデルが発売されました。このモデルは、GDR2を搭載した唯一のモデルであり、最大の斜めスクリーン(4.7インチ)でした。
だから、スマートフォンはモスクワから来ており、コラムはアメリカから来ており、どのドッキングステーションが中国から私に届くかを選択することは残っています。
私はすべてが色のスタイルに耐えなければならなかったことに言及するのを忘れました。なぜなら、スピーカーとスマートフォンは白だけで購入されたからです。 このデザインが置かれるインテリアを考慮に入れました。 microUSBコネクタを備えた白いドッキングステーションはほとんどないことが判明しました。 どうやら、中国では、Appleにとって白が意味するのであれば、黒は他のすべてを意味すると考えられているためです。 また、ドッキングステーションに2つ目の切り込みを入れて、スマートフォンを水平に配置してビデオを視聴できるようにしたかったのです(わかりません)。 そのようなドッキングステーションは1つだけでした。 2つを注文することが決定されました。 ノッチなし。
悲しいかな、中国は悲しかった。 追加付きドックコネクタ。 くぼみは表面に対して正確に直角に配置されていたため、非常に不便でした。 しかし、ノッチのないドッキングステーションでは、コネクタは本来の位置-わずかな角度で配置されていました。 ドッキングステーションを単純に接着することが決定されました-それは面白い梯子であることが判明しました。ところで、スマートフォンをクリックすると、2倍重いのでより安定しています。
Windows Phoneには、検索ボタンという不要な詳細が1つあります。 USAリージョンを設定し、デフォルトの検索がBingである場合、はい-多かれ少なかれ賢明なアプリケーションが起動しますが、このコンテキストではこのボタンはまったく必要ないので、不注意でクリックしないように接着してください。 アイデアは同じ名前のステッカーでさえ、Yandexの従業員によってスパイされました。
ラジオを固定する
その後、別の誤算が明らかになりました。 スマートフォンのラジオはヘッドフォンをアンテナとして使用しているため、スピーカーにワイヤレスで接続すると、ラジオはオンになりません。 その後、コードを介して動作することが判明しましたが、組み込みのスピーカーを介してのみ動作しました。 スピーカーをケーブルでスマートフォンに接続する必要がありました。
何らかの理由で、Windows Phone 8.0はラジオを操作するためのAPIをすぐに有効にしなかったため、GDR2以降の更新でのみ機能します(もちろん、ハードウェアラジオサポートがある場合)。
ラジオでの作業は非常に簡単であることが判明しました。
FMRadio radioInstance = FMRadio.Instance; // radioInstance.CurrentRegion = RadioRegion.Europe; // radioInstance.PowerMode = RadioPowerMode.On; // radioInstance.Frequency = frequency;
周波数-これは、変更する必要があるラジオ局の周波数です。 組み込みのラジオプログラムには、ラジオ局検索モードがあります。 残念ながら、成功した実装の検索は何にもつながりませんでした。
大丈夫です。スマートフォンが立つ場所で受信される周波数を測定し、ハードコードを規定するだけです。 次に、ボタンを作成し、各ラジオ局に掛けます。 ボタンを大きくすることで、あまり照準を合わせる必要がなくなります。
ハードウェアボタンに煩わされないように、最上部に「戻る」ボタンを追加します。Lumia625では、ハードウェアボタンが強調表示されず、画面上でボタンが見えにくくなります。
画面をオフにすることで問題を解決します
ラジオは機能しています。 上にスワイプするような単純なロック解除ジェスチャーでさえ、祖母にとって難しいのではないかという懸念があります。 そのため、画面ロックを無効にして、使用を最小限に抑える必要があります。
さまざまなWindows Phoneファームウェアには、画面をオフにするためのさまざまな時間モードのセットがあります。 ノキアLumia 920(AT&Tではない)は、一般にWP 8.0で「ディスプレイをオフにする:しない」オプションを持つ唯一のノキアです。 他のデバイスでは、このアイテムはカットされ、最大5分間かかります。
比較:左側のNokia 920、右側の1020(520、620、625、720、820、920 AT&Tでも同じ)。
しかし、GDR2からは、ディスプレイをオフにしないナビゲーションプログラムがあります。そのため、何らかの方法でこれをコードで実行できます。 わかりました、MSDNを羊毛し、見つけて下さい:
PhoneApplicationService phoneAppService = PhoneApplicationService.Current; phoneAppService.UserIdleDetectionMode = IdleDetectionMode.Disabled;
ユーザーがロックボタンを押さない限り、これらの行は表示を維持します。 これが必要なものです。
メモリカードを使用したフレンドアプリケーション
次に、メモリカードを使用して作業を実装する必要があります。 ラジオモードのラジオステーションのボタンのように、音楽のあるフォルダーの名前のボタンが画面に表示されるようにします。
ただし、問題があります:Windows Phoneは音楽で動作しますが、音楽がアプリケーション自体で保護されている場合(メモリカードとコンテンツの迅速な交換が必要)、または音楽が必ずMusicフォルダー内にある場合(フォルダーの操作が必要)のみです。
松葉杖はすぐには見つかりませんでした。
まず、 WMAppManifest.xmlマニフェストで 、メモリカード上のファイル形式のみを認識し、他のファイルには気付かないことをシステムに伝えます。 さらに、形式にはmp3コンテンツが含まれます。 たとえば、「mp3d」などの形式を呼び出します(よく知られている拡張子を除き、好きな名前を付けることができます)。
<Extensions> <FileTypeAssociation Name="mp3" NavUriFragment="fileToken=%s" TaskID="_default"> <SupportedFileTypes> <FileType ContentType="application/mp3">.mp3d</FileType> </SupportedFileTypes> </FileTypeAssociation> </Extensions>
欠点は、すべてのmp3ファイルの名前をmp3dファイルに変更する必要があることですが、renコマンドがすべてを処理してくれます。
ren *.mp3 *mp3d
今、私たちはカードにしがみつき、私の音楽フォルダのサブフォルダのリストを形成するメソッドを書いています。
private async Task<List<ExternalStorageFolder>> ReadFoldersFromSdAsync() { List<ExternalStorageFolder> folders = new List<ExternalStorageFolder>(); // SD- ExternalStorageDevice _sdCard = (await ExternalStorage.GetExternalStorageDevicesAsync()).FirstOrDefault(); // if (_sdCard != null) { // MyMusic ExternalStorageFolder routesFolder = await _sdCard.GetFolderAsync("MyMusic"); // IEnumerable<ExternalStorageFolder> routeFolders = await routesFolder.GetFoldersAsync(); folders = routeFolders.ToList(); } return folders; }
このメソッドを使用して、ボタンを作成し、リストに追加します(スタイルは省略します-スタイルはソースにあります)。 現在のフォルダーをタグに配置し、後で(OnTap)をクリックしてアクセスできるようにします。
foreach (var f in folders) { IEnumerable<ExternalStorageFile> files = await f.GetFilesAsync(); if (files.Count() > 0) { Button button = new Button { Tag = f, Height = 85, Width = 456, Content = f.Name }; button.Tap += this.OnTap; ContentStack.Children.Add(button); } }
OnTapイベント内で、shamanize:アプリケーション内のmp3dファイルをmp3ファイルmyFile.mp3としてコピーし、コピーしたファイルのURIを取得して、リソースとしてMediaElementにフィードします。
IEnumerable<ExternalStorageFile> files = await folder.GetFilesAsync(); // ... // . ExternalStorageFile file = files.First(); Uri uri = null; // using (Stream streamToRead = await file.OpenForReadAsync()) { if (streamToRead.Length <= int.MaxValue) { int length = (int)streamToRead.Length; Byte[] bytes = new Byte[length]; streamToRead.Read(bytes, 0, length); // StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder; var fileToWrite = await local.CreateFileAsync("myFile.mp3", CreationCollisionOption.ReplaceExisting); // using (Stream streamToWrite = await fileToWrite.OpenStreamForWriteAsync()) { streamToWrite.Write(bytes, 0, length); } // URI uri = new Uri(fileToWrite.Path, UriKind.Absolute); } } if (uri != null) { MusicElement.Source = uri; }
音楽が流れます。
スクリーンセーバーで時間を書きます
一定の非アクティブ時間(ボタンが押されていない状態)の後、画面に大きな時計、曜日、曜日が表示されるようにすることが決定されました。
時間を表示するために、1秒の間隔でタイマーを開始します。
DispatcherTimer dtm = new DispatcherTimer(); dtm.Interval = TimeSpan.FromSeconds(1); dtm.Tick += OnTimerTick; dtm.Start();
イベントに応じて、ティック数をカウントし、29の場合、画面に時間を表示します。
private void OnTimerTick(Object s, EventArgs e) { UpdateDate(); _ticks++; if (_ticks == 29) { // } }
他のボタンをクリックすると、_ticksをゼロにリセットします。
さらに、タイマーは1秒に1回時間を更新する機能を実行します。DateTime.Nowを解析し、テキストフィールドに分散する関数を呼び出します。
スライドショーを追加する
時間を見るのはつまらないので、写真のスライドショーを作成します。 同じサイズで美しいコンテンツの写真をどこで入手できますか? ビングから!
同じアニメーションに置き換えるのが非常に便利なため、同じサイズの写真が必要でした。何もうまくいかず、間違った場所に浮かぶことはありません。
トレントにはアーカイブがありますが、サイズの異なる写真は機能しません。 Bingの写真を取得できる優れたサービスがありますが、写真はスマートフォンの画面専用であり(もっと欲しい)、先週だけです。
最後に、自分の要件を満たすアーカイブを見つけました 。 収縮するだけです。
写真は、電話機自体のPicturesフォルダに保存されていました。
アプリケーションは、これらの写真をランダムな順序で一度に1つずつ撮るように指示されました。
bg.Source = PictureDecoder.DecodeJpeg(_mediaLibrary.Pictures[_random.Next(_imageQuantity)].GetImage());
次に、Imageオブジェクトが水平方向に移動するアニメーションを描画し、次に画像を変更します。
アイコンを描く
Windows Phoneのインターフェイスは、見逃せないアプリケーションへの巨大なショートカットをデスクトップにもたらすことがわかったため、非常に便利であることがわかりました。 基本的なインターフェイスを作成しているため、「ラジオ」と「音楽」という言葉は単にアイコンとして表示されていました。
また、デスクトップ上のSPB TVへの2つのショートカットを作成しました:Channel OneとCulture。
指示を書く
インターフェースをどのようにシンプルにしようとしても、祖母がどのように彼と友達になるか予測できなかったので、スクリーンショットと写真で指示を書きました。 ソースコードと一緒に命令を公開します-突然、誰かが私の祖母の役に立つでしょう。
まとめ
私の主な恐怖は正当化されませんでした:2分もたたないうちに、祖母にアプリケーションの使用方法を説明し始めたとき、彼女自身がボタンやショートカットをクリックし、曲を入れ、アプリケーションを閉じたり開いたりし始めました。 私はロックを完全に知覚し、「カーテンを上げ下げする」ようなものだと言いました。 目標は無事に達成され、今では彼女はお気に入りの音楽を演奏しています。 DIYギフトは成功しました!
ソースと手順
UPD:
労働者の要求に応じて、インテリアに写真を追加します。