Android Tutorial MediaPlayer Tutorial

klaus

Expert
Licensed User
Longtime User
Der MediaPlayer dient zum Spielen von Audio Dateien.
MediaPlayer unterstützt folgende Formate: MP3, Midi, Wave und OGG. Die vollständige Liste ist hier verfügbar: Android Supported Media Formats | Android Developers


Das Beispielprogramm befindet sich am Ende.
Das Englische OrginalTutorial.


Um eine Datei spielen zu können muß man sie zuerst laden:
B4X:
MediaPlayer1.Load(File.DirAssets, "IsawHerStandingThere.mid")
In diesem Fall wurde die Datei mit dem File Manager hinzugefügt und deshalb wird File.DirAssets benutzt.

Jetzt können wir die Datei abspielen, mit:
B4X:
MediaPlayer1.Play
und das Abspielen auf Pause stellen mit:
B4X:
MediaPlayer.Pause
Aufrufen von Play setzt das Abspielen, von der gleichen Stelle, fort.
Beachten Sie daß man Pause nur aufrufen kann wenn der MediaPlayer spielt.

Man kann MediaPlayer.Load irgendwo aufrufen (nach der Initialisierung), um eine neue Datei zu laden.
MediaPlayer muß in Process_Globals deklariert werden ansonsten würde jedesmal eine neue Instanz erzeugt werden wenn die Activity neu erstellt wird.


Das Beispielprogramm zeigt dem Benutzer den Fortschritt der Abspielung an und erlaubt ihm die Stelle zu ändern.

mediaplayer_1.png


Dies ist der Code:
B4X:
Sub Process_Globals
    Dim MediaPlayer1 As MediaPlayer
    Dim timer1 As Timer
End Sub

Sub Globals
    Dim barPosition As SeekBar
    Dim barVolume As SeekBar
    Dim lblPosition As Label
    Dim Looping As ToggleButton
End Sub

Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
        MediaPlayer1.Initialize( )
        MediaPlayer1.Load(File.DirAssets, "IsawHerStandingThere.mid")
        Timer1.Initialize("timer1", 1000)
    End If
    Activity.LoadLayout("1")
    Looping_CheckedChange(Looping.Checked) 'set the default value
End Sub

Sub Activity_Resume
    MediaPlayer1.Play
    timer1.Enabled = True
    timer1_Tick 'don't wait one second for the UI to update.
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    If MediaPlayer1.IsPlaying Then MediaPlayer1.Pause
    timer1.Enabled = False
End Sub

Sub timer1_Tick
    If MediaPlayer1.IsPlaying Then
        barPosition.Value = MediaPlayer1.Position / MediaPlayer1.Duration * 100
        lblPosition.Text = "Position: " & ConvertToTimeFormat(MediaPlayer1.Position) & _
            " (" & ConvertToTimeFormat(MediaPlayer1.Duration) & ")"
    End If
End Sub
'converts milliseconds to m:ss format.
Sub ConvertToTimeFormat(ms As Int) As String
    Dim seconds, minutes As Int
    seconds = Round(ms / 1000)
    minutes = Floor(seconds / 60)
    seconds = seconds Mod 60
    Return NumberFormat(minutes, 1, 0) & ":" & NumberFormat(seconds, 2, 0) 'ex: 3:05
End Sub

Sub barVolume_ValueChanged (Value As Int, UserChanged As Boolean)
    MediaPlayer1.SetVolume(barVolume.Value / 100, barVolume.Value / 100)
End Sub

Sub barPosition_ValueChanged (Value As Int, UserChanged As Boolean)
    If UserChanged = False Then Return 'the value was changed programmatically
    MediaPlayer1.Position = Value / 100 * MediaPlayer1.Duration
    If MediaPlayer1.IsPlaying = False Then 'this can happen when the playback reached the end and the user changes the position
        MediaPlayer1.Play
    End If
    timer1_Tick 'immediately update the progress label
End Sub

Sub Looping_CheckedChange(Checked As Boolean)
    MediaPlayer1.Looping = Checked
End Sub
Wir initialisieren den MediaPlayer nur einmal beim Start der Anwendung.
Das Abspielen beginnt in Activity_Resume, wenn die Activity fortgesetzt (resumed) wird, und das unmittelbar nach Activity_Create .


Ein Timer wird verwendet, um jede Sekunde die Wiedergabe-Stelle zu prüfen und das Label und die SeekBar zu aktualisieren.
Beachten Sie, daß das SeekBar_ValueChanged Event einen booleschen Wert namens UserChanged enthält mit dem man zwischen einer Änderung durch den Benutzer (durch Ziehen mit dem Daumen) und einer programmatischen Änderung unterscheiden kann.


Die Looping Eigenschaft bestimmt, ob die Wiedergabe automatisch neu starten soll, wenn das Ende erreicht ist.

Das Beispielprogramm :

zip.gif
MediaPlayer.zip
 
Last edited:

cubetennis

Member
Licensed User
Longtime User
MediaPlayer

Hallo Klaus,

wie kann eine Datei (xxx.mp3), die auf der sd-Karte liegt, abspielt werden ?

Mit:
MediaPlayer1.Load(File.DirAssets, "/mnt/sdcard/media/audio/xxx.mp3")
funktioniert es nicht.

Wie sieht die richtige Syntax dafür aus ?

Bitte um Hilfe / Danke
 

klaus

Expert
Licensed User
Longtime User
Zu erst, könntest Du bitte Fragen im Deutschen Forum stellen.

Antwort zu Deiner Frage:
MediaPlayer1.Load(File.DirAssets, "/mnt/sdcard/media/audio/xxx.mp3")
kann nicht funktionieren, weil File.DirAssets der Ordner ist der in der apk Datei mit eingebunden ist und die Dateien die da drin sind sind nur lesbar und komprimiert.

Mein Vorschlag ist
MediaPlayer1.Load(File.DirRootExternal&"/media/audio/", xxx.mp3")

Hier findest Du ein Paar Erklärungen.

zu benutzen.

Beste Grüsse.
 
Last edited:

BarrySumpter

Active Member
Licensed User
Longtime User
Any chance I can get someone to repost the MediaPlayer.zip file?
I get errors when unzipping.
tia
 

BarrySumpter

Active Member
Licensed User
Longtime User
Thanks Klaus,

Just tried again with Winxp32 built in compressed zip folder extractor and same problem.

But was successful with ExtractNow.
 

birnesoft

Active Member
Licensed User
Longtime User
Hello,

I need the exact position of the mediaplayer.
I tryed
B4X:
do
Log(mp.position)

'and

Dim jo As JavaObject = mp
Log(jo.RunMethod("getPosition", null))

loop

but the position changes only every 80 msec.
Is it possiple to get the position more exact (1 msec)?

thanks Björn
 

GMan

Well-Known Member
Licensed User
Longtime User
Cant you use a (milli)timer or something like that ?
 

birnesoft

Active Member
Licensed User
Longtime User
Cant you use a (milli)timer or something like that ?

yes this was my solution,

I wait till the mp.position changed and
save Datetime.now in a variable and
calculate the milliseconds from the variable to Datetime.now+mp.position.
 
Top