Android
Media Player
Suche…
Syntax
- void setAudioStreamType (int streamtype)
- void setDataSource (Kontext-Kontext, Uri-Uri)
- ungültig vorbereiten ()
- void prepareAsync ()
- void start ()
- void stop ()
Bemerkungen
Die Verwendung des MediaPlayer
basiert hauptsächlich auf dem Zustandsdiagramm:
Das heißt, um Audio / Video abzuspielen, muss eine bestimmte Reihenfolge von Aktionen festgelegt werden. Es gibt auch an, welche Aktionen in welchem Zustand durchgeführt werden können .
Der MediaPlayer-API fehlt die Flexibilität (Hinzufügen benutzerdefinierter Decoder- und Rendering-Logik) und es fehlt die Unterstützung für Dynamic Adaptive Streaming über HTTP (DASH) und SmoothStreaming. Sehen Sie sich dazu den ExoPlayer an .
Grundlegendes Schaffen und Spielen
Mit der MediaPlayer-Klasse können Sie die Wiedergabe von Audio- / Videodateien und Streams steuern.
Die Erstellung eines MediaPlayer-Objekts kann auf drei Arten erfolgen:
Medien aus lokaler Ressource
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.resource); mediaPlayer.start(); // no need to call prepare(); create() does that for you
Von der lokalen URI (erhalten von ContentResolver)
Uri myUri = ....; // initialize Uri here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start();
Von externer URL
String url = "http://........"; // your URL here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); // might take long! (for buffering, etc) mediaPlayer.start();
Asynchrone Vorbereitung
Der MediaPlayer$prepare()
ist ein blockierender Aufruf und friert die Benutzeroberfläche ein, bis die Ausführung abgeschlossen ist. Um dieses Problem zu lösen, kann der MediaPlayer$prepareAsync()
verwendet werden.
mMediaPlayer = ... // Initialize it here
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
@Override
public void onPrepared(MediaPlayer player) {
// Called when the MediaPlayer is ready to play
mMediaPlayer.start();
}
}); // Set callback for when prepareAsync() finishes
mMediaPlayer.prepareAsync(); // Prepare asynchronously to not block the Main Thread
Bei synchronen Vorgängen werden Fehler normalerweise mit einer Ausnahme oder einem Fehlercode gemeldet. Wenn Sie jedoch asynchrone Ressourcen verwenden, sollten Sie sicherstellen, dass Ihre Anwendung über Fehler entsprechend benachrichtigt wird. Für MediaPlayer
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener(){
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
// ... react appropriately ...
// The MediaPlayer has moved to the Error state, must be reset!
// Then return true if the error has been handled
}
});
Systemklingeltöne abrufen
Dieses Beispiel zeigt, wie Sie die URIs von Systemklingeltönen abrufen ( RingtoneManager.TYPE_RINGTONE
):
private List<Uri> loadLocalRingtonesUris() {
List<Uri> alarms = new ArrayList<>();
try {
RingtoneManager ringtoneMgr = new RingtoneManager(getActivity());
ringtoneMgr.setType(RingtoneManager.TYPE_RINGTONE);
Cursor alarmsCursor = ringtoneMgr.getCursor();
int alarmsCount = alarmsCursor.getCount();
if (alarmsCount == 0 && !alarmsCursor.moveToFirst()) {
alarmsCursor.close();
return null;
}
while (!alarmsCursor.isAfterLast() && alarmsCursor.moveToNext()) {
int currentPosition = alarmsCursor.getPosition();
alarms.add(ringtoneMgr.getRingtoneUri(currentPosition));
}
} catch (Exception ex) {
ex.printStackTrace();
}
return alarms;
}
Die Liste hängt von der Art der angeforderten Klingeltöne ab. Die Möglichkeiten sind:
-
RingtoneManager.TYPE_RINGTONE
-
RingtoneManager.TYPE_NOTIFICATION
-
RingtoneManager.TYPE_ALARM
-
RingtoneManager.TYPE_ALL = TYPE_RINGTONE | TYPE_NOTIFICATION | TYPE_ALARM
Um die Klingeltöne als android.media.Ringtone
muss jeder Uri
vom RingtoneManager
aufgelöst werden:
android.media.Ringtone osRingtone = RingtoneManager.getRingtone(context, uri);
Um den Ton abzuspielen, verwenden Sie die Methode:
public void setDataSource(Context context, Uri uri)
von android.media.MediaPlayer
. MediaPlayer
muss gemäß dem Zustandsdiagramm initialisiert und vorbereitet werden
Systemlautstärke abrufen und einstellen
Audiostream-Typen
Es gibt verschiedene Profile von Klingelton-Streams. Jeder von ihnen hat ein anderes Volumen.
Jedes Beispiel hier ist für AudioManager.STREAM_RING
Stream-Typ AudioManager.STREAM_RING
geschrieben. Dies ist jedoch nicht der einzige. Die verfügbaren Stream-Typen sind:
-
STREAM_ALARM
-
STREAM_DTMF
-
STREAM_MUSIC
-
STREAM_NOTIFICATION
-
STREAM_RING
-
STREAM_SYSTEM
-
STREAM_VOICE_CALL
Lautstärke einstellen
Um das Volumen eines bestimmten Profils zu erhalten, rufen Sie an:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);
Dieser Wert ist sehr wenig nützlich, wenn der Maximalwert für den Stream nicht bekannt ist:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int streamMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);
Das Verhältnis dieser beiden Werte ergibt ein relatives Volumen (0 <Volumen <1):
float volume = ((float) currentVolume) / streamMaxVolume
Lautstärke um einen Schritt einstellen
Um das Volume für den Stream um eine Stufe zu erhöhen, rufen Sie Folgendes auf:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_RAISE, 0);
Um das Volume für den Stream um einen Schritt zu verringern, rufen Sie Folgendes auf:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_LOWER, 0);
Festlegen, dass MediaPlayer einen bestimmten Stream-Typ verwendet
Dazu gibt es eine Hilfsfunktion aus der MediaPlayer
Klasse.
Rufen void setAudioStreamType(int streamtype)
einfach void setAudioStreamType(int streamtype)
:
MediaPlayer mMedia = new MediaPlayer();
mMedia.setAudioStreamType(AudioManager.STREAM_RING);
Media Player mit Pufferfortschritt und Wiedergabeposition
public class SoundActivity extends Activity {
private MediaPlayer mediaPlayer;
ProgressBar progress_bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tool_sound);
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
progress_bar = (ProgressBar) findViewById(R.id.progress_bar);
btn_play_stop.setEnabled(false);
btn_play_stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(mediaPlayer.isPlaying()) {
mediaPlayer.pause();
btn_play_stop.setImageResource(R.drawable.ic_pause_black_24dp);
} else {
mediaPlayer.start();
btn_play_stop.setImageResource(R.drawable.ic_play_arrow_black_24px);
}
}
});
mediaPlayer.setDataSource(proxyUrl);
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
observer.stop();
progress_bar.setProgress(mp.getCurrentPosition());
// TODO Auto-generated method stub
mediaPlayer.stop();
mediaPlayer.reset();
}
});
mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
progress_bar.setSecondaryProgress(percent);
}
});
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
btn_play_stop.setEnabled(true);
}
});
observer = new MediaObserver();
mediaPlayer.prepare();
mediaPlayer.start();
new Thread(observer).start();
}
private MediaObserver observer = null;
private class MediaObserver implements Runnable {
private AtomicBoolean stop = new AtomicBoolean(false);
public void stop() {
stop.set(true);
}
@Override
public void run() {
while (!stop.get()) {
progress_bar.setProgress((int)((double)mediaPlayer.getCurrentPosition() / (double)mediaPlayer.getDuration()*100));
try {
Thread.sleep(200);
} catch (Exception ex) {
Logger.log(ToolSoundActivity.this, ex);
}
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mediaPlayer.stop();
}
}
<LinearLayout
android:gravity="bottom"
android:layout_gravity="bottom"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:weightSum="1">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageButton
app:srcCompat="@drawable/ic_play_arrow_black_24px"
android:layout_width="48dp"
android:layout_height="48dp"
android:id="@+id/btn_play_stop" />
<ProgressBar
android:padding="8dp"
android:progress="0"
android:id="@+id/progress_bar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</LinearLayout>
</LinearLayout>
Importieren Sie Audio in Androidstudio und spielen Sie es ab
Dies ist ein Beispiel, wie Sie eine Audiodatei abspielen können, die Sie bereits auf Ihrem PC / Laptop haben. Erstellen Sie zunächst ein neues Verzeichnis unter res und benennen Sie es als roh
Kopieren Sie das Audio, das Sie abspielen möchten, in diesen Ordner. Es kann sich um eine MP3- oder WAV-Datei handeln.
Wenn Sie zum Beispiel auf den Knopf klicken, möchten Sie diesen Sound wiedergeben. So wird es gemacht
public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.aboutapp_activity);
MediaPlayer song=MediaPlayer.create(this, R.raw.song);
Button button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
song.start();
}
});
}
}
Dadurch wird der Song nur einmal abgespielt, wenn auf die Schaltfläche geklickt wird. Wenn Sie den Song bei jedem Klick erneut abspielen möchten, klicken Sie auf den folgenden Code
public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.aboutapp_activity);
MediaPlayer song=MediaPlayer.create(this, R.raw.song);
Button button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (song.isPlaying()) {
song.reset();
song= MediaPlayer.create(getApplicationContext(), R.raw.song);
}
song.start();
}
});
}
}