Setting RingTones with Windows 8.1

Design

Start Visual Studio 2013 and create a new Windows Phone VB application, by clicking File, New Project, Windows Phone Apps, Blank App, as shown in Figure 1:

Ring1
Figure 1: New Windows Phone app

Once the framework has been created, add the following onto your MainPage.xaml page:

  • One list box with the following items:
    • Button with a Content value of Tone 1
    • Button with a Content value of Tone 2
    • Button with a Content value of Tone 3
  • Media Element named Player

Your page should resemble Figure 2:

Ring2
Figure 2: Our Design

Code

Now that the page is set up, we can add the necessary code to add new ringtones to our application.

Add the following Namespaces to the top of your form:

Imports Microsoft.Phone.Tasks
Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Windows.Resources
Imports Microsoft.Xna.Framework
Imports Microsoft.Xna.Framework.Media

These enable us to work with media elements, such as music, and manipulate the Storage area of our Windows Store applications. Add the next fields to your application:

   Private ToneChooser As SaveRingtoneTask

   Private strPath As String = "Ringtones/"


   Private timer As GameTimer

   Private resumeP As Boolean = False

I created an object named ToneChooser that will enable me to save a ringtone via the SaveRingtoneTAsk interface. I created a string variable to identify the location of my ringtones. If you haven’t already done so, add three music (preferably .wma files) to your project as shown in Figure 3:

Ring3
Figure 3: Solution Explorer with added music files

The rest of the objects will allow me to play these files. Now, let me get down to business!

Add the constructor:

   Public Sub New()

      timer = New GameTimer()
      timer.UpdateInterval = TimeSpan.FromTicks(333333)
      AddHandler timer.Update, AddressOf timer_Update

      ' Start the timer
      timer.Start()


      ToneChooser = New SaveRingtoneTask()
      AddHandler ToneChooser.Completed,
         AddressOf ToneChooser_Completed

      InitializeComponent()
   End Sub

Here, I created a new GameTimer object that will regularly update the display. I also initialized a SaveRingtoneTask object so that I can save a ringtone to the Windows Store.

Add the Timer Update event:

   Private Sub timer_Update(ByVal sender As Object,
      ByVal e As GameTimerEventArgs)
      FrameworkDispatcher.Update()
    End Sub

Add the following code for the MediaElement:

   Private Sub media_CurrentStateChanged(ByVal sender As Object,
      ByVal e As RoutedEventArgs)

      If resumeP Then
         Player.Play()
      End If

   End Sub

This simply checks to see if the player has been paused or not. If it was paused, the player must be playing again.

Now, that the basics are done, let me start getting more complicated…. Add the following three methods:

   Private Sub ToneChooser_Completed(ByVal sender As Object,
      ByVal e As TaskEventArgs)
      If e.TaskResult = TaskResult.OK Then
         tb1.Text = "Save completed."
      ElseIf e.TaskResult = TaskResult.Cancel Then
         tb1.Text = "Save cancelled."
      End If

   End Sub

   Private Function GetRingtonePath() As String
      Dim strMsg As String = String.Empty
      Dim ringtonePath As String = Nothing

      Dim selection As ListBoxItem = CType(lstTonez.SelectedItem,
         ListBoxItem)

      If Nothing IsNot selection Then

         Dim filename As String = selection.Name & ".wma"

         ringtonePath = strPath & filename
      Else
         strMsg = "Nothing selected"
      End If


      Return ringtonePath
  End Function

   Private Sub SaveToStore(ByVal fileName As String, ByVal data() As Byte)
      Dim strBase As String = String.Empty
      Dim strDelimiter As String = "/"
      Dim delimiter() As Char = strDelimiter.ToCharArray()
      Dim dirsPath() As String = fileName.Split(delimiter)


      Dim isoStore As IsolatedStorageFile =
         IsolatedStorageFile.GetUserStoreForApplication()


      For i = 0 To dirsPath.Length - 2
         strBase = System.IO.Path.Combine(strBase, dirsPath(i))

         If Not isoStore.DirectoryExists(strBaseDir) Then
            isoStore.CreateDirectory(strBaseDir)
         End If
      Next i


      ' Write the file
      Using bw As New BinaryWriter(isoStore.CreateFile(fileName))
         bw.Write(data)

      End Using
   End Sub

The first event simply shows us that a selection has been made. The second sub, GetRingtonePath, simply gets the associated ringtone’s path. The last sub, SaveToStore, saves the selected item to the Windows Store, inside your app’s isolated storage area, after some manipulation of the filename(s).

I am attaching a working sample.

Conclusion

Short and sweet. I hope you have enjoyed today’s quick tip. Until next time, cheers!

Hannes DuPreez
Hannes DuPreez
Ockert J. du Preez is a passionate coder and always willing to learn. He has written hundreds of developer articles over the years detailing his programming quests and adventures. He has written the following books: Visual Studio 2019 In-Depth (BpB Publications) JavaScript for Gurus (BpB Publications) He was the Technical Editor for Professional C++, 5th Edition (Wiley) He was a Microsoft Most Valuable Professional for .NET (2008–2017).

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read