SaveRingtoneTaskで着メロ設定と電話をかける

2011年11月18日(金)
PROJECT KySS

次に、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で着メロ設定」サンプルプログラム

  • 「電話をかける」サンプルプログラム

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています