連載 :
Windows Phone Tips集SaveRingtoneTaskで着メロ設定と電話をかける
2011年11月18日(金)
次に、MainPage.xamlを展開して表示される、MainPage.xaml.vbをダブルクリックしてリスト2のコードを記述します。
ロジックコードを記述する
リスト2 (MainPage.xaml.vb)
Option Strict On ランチャーやチューザーに関するクラスの含まれる、Microsoft.Phone.Tasks名前空間をインポートします。 Imports Microsoft.Phone.Tasks 仮想ファイルシステムを作成および使用するための型が含まれている、System.IO.IsolatedStorage 名前空間をインポートします。 Imports System.IO.IsolatedStorage アプリケーションでのリソースの使用をサポートするクラスを提供する、System.Windows.Resources名前空間をインポートします。 Imports System.Windows.Resources Partial Public Class MainPage Inherits PhoneApplicationPage ' コンストラクター Public Sub New() InitializeComponent() End Sub
[着メロ設定]ボタンがクリックされた時の処理
新しい、WebClientのインスタンス、myWebClientを生成します。WebClientクラスはSystem.Net名前空間に属し、URI で識別されるリソースとの間でデータを送受信する共通メソッドを提供するクラスです。 OpenReadAsyncメソッドで、指定したURIのwmaファイルを開きます。相対URIで指定します。OpenReadAsyncメソッドは、指定したリソースに対する読み取り可能なストリームを開くメソッドです。 AddHandlerステートメントで、OpenReadCompletedイベントハンドラを追加します。OpenReadCompletedイベントは、非同期のリソース読み取り操作の完了時に発生します。 OpenReadCompletedイベント内では以下の処理を行います。 変数storageを、ファイルとディレクトリを格納している分離ストレージ領域を表すIsolateStorageFileクラスとして宣言し、呼び出し元のコードのアプリケーションIDに対応する、ユーザースコープの分離ストレージを取得します。 StreamResourceInfoクラスの型のresource変数を宣言します。StreamResourceクラスは、GetResourceStreamメソッドを使って取得したリソースのストリーム情報を提供するクラスです。ここでは、wmaファイルのストリーム情報を取得しています。wmaファイルは、ビルドアクションプロパティが「コンテンツ」になっていますので、GetResourceStreamメソッドでファイル名を指定してリソースを取得できます。 ストレージ内に「GreenBells.wma」という同じファイルが存在する場合は、削除します。 IsolatedStorageFileStreamクラス型のオブジェクト変数fileを宣言します。IsolatedStorageFileStreamクラスは、分離ストレージ内のファイルを公開するクラスです。IsolatedStorageFileクラスのCreateFileメソッドで「GreenBells.wma」ファイルを分離ストレージ内に作成します。Integer型変数bufferSizeに1023を格納し、bufferSizeで初期化された新しいByte型配列変数buffersを生成します。バッファサイズを1023確保します。 StreamResourceInfoクラスのStream.Readメソッドで、リソースに格納されているストリームを読み取りIsolatedStorageFileStreamにWriteメソッドで書き込みます。InlineAssignHelperヘルパー関数(後述)を使っています。 IsolatedStorageFileStream.Write メソッドの書式は下記の通りです。 IsolatedStorageFileStream.Write(書き込むバッファ,開始位置を示すバッファ内のオフセット,書き込むバッファの最大バイト数) SaveRingtoneTaskの新しいインスタンスmySaveRingtoneTaskオブジェクトを生成します。 DisplayNameプロパティには着メロを識別するための名前を指定します。これを指定しておくとOSから呼び出された「呼び出し音の保存」画面の「着信音の名前」に、ここで指定した名前が表示されます。 IsShareableプロパティには、着メロが他のアプリケーションからアクセス可能にするかどうかを示すフラグを指定します。可能にする場合はTrue、禁止する場合はFalseを指定します。ここではTrueを指定しています。 Sourceプロパティには分離ストレージに保存したファイルをパス付きで指定します。 チューザータスクが完了した時に発生するCompletedイベント内に、イベントハンドラを指定します。 イベントハンドラ内では、チューザータスクが正常に完了した場合には「保存に成功しました。」のメッセージを表示させます、それ以外は「保存に失敗しました。」と表示し処理を抜けます。 Private Sub Button1_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click Dim myWebClient As New WebClient AddHandler myWebClient.OpenReadCompleted, Sub(resultSender As Object, resultArgs As OpenReadCompletedEventArgs) Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication Dim resource As StreamResourceInfo = Application.GetResourceStream(New Uri("GreenBells.wma", UriKind.Relative)) If storage.FileExists("GreenBells.wma") = True Then storage.DeleteFile("GreenBells.wma") End If Using file As IsolatedStorageFileStream = storage.CreateFile("GreenBells.wma") Dim bufferSize As Integer = 1023 Dim buffers As Byte() = New Byte(bufferSize) {} Dim bufferCount As Integer While (InlineAssignHelper(bufferCount, resource.Stream.Read(buffers, 0, bufferSize))) > 0 file.Write(buffers, 0, bufferCount) End While End Using Dim mySaveRingToneTask As New SaveRingtoneTask With mySaveRingToneTask .DisplayName = "The Green Bells" .IsShareable = True .Source = New Uri("isostore:/GreenBells.wma") End With AddHandler mySaveRingToneTask.Completed, Sub(mySender As Object, myArgs As TaskEventArgs) If myArgs.TaskResult = TaskResult.OK Then MessageBox.Show("保存に成功しました。") Else MessageBox.Show("保存に失敗しました。") Exit Sub End If End Sub mySaveRingToneTask.Show() End Sub myWebClient.OpenReadAsync(New Uri("GreenBells.wma", UriKind.Relative)) End Sub
MSDNのドキュメントで下記のように定義されているInlineAssignHelperヘルパー関数
Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, ByVal value As T) As T target = value Return value End Function End Class
「SaveRingtoneTaskで着メロ設定」サンプルプログラム
「電話をかける」サンプルプログラム
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。