Android
Odtwarzacz multimedialny
Szukaj…
Składnia
- void setAudioStreamType (int streamtype)
- void setDataSource (kontekst kontekstowy, identyfikator Uri)
- void przygotowanie ()
- void preparAsync ()
- void start ()
- void stop ()
Uwagi
Wykorzystanie MediaPlayer
opiera się głównie na diagramie stanu:
Oznacza to, że aby odtworzyć audio / wideo, musi wystąpić określona sekwencja czynności w określonej kolejności. Wskazuje również, jakie działania można podjąć w jakim stanie .
Interfejs API MediaPlayer nie ma elastyczności (dodawanie niestandardowego dekodera i logiki renderowania) i brakuje sSupport dla dynamicznego adaptacyjnego przesyłania strumieniowego przez HTTP (DASH) i SmoothStreaming. W tym celu zajrzyj do ExoPlayer .
Podstawowe tworzenie i odtwarzanie
Klasa MediaPlayer może służyć do sterowania odtwarzaniem plików audio i wideo oraz strumieni.
Tworzenie obiektu MediaPlayer może mieć trzy typy:
Media z lokalnego zasobu
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.resource); mediaPlayer.start(); // no need to call prepare(); create() does that for you
Z lokalnego identyfikatora URI (uzyskanego z ContentResolver)
Uri myUri = ....; // initialize Uri here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start();
Z zewnętrznego adresu 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();
Przygotowanie asynchroniczne
MediaPlayer$prepare()
to wywołanie blokujące i zamrozi interfejs użytkownika do czasu zakończenia wykonywania. Aby rozwiązać ten problem, można użyć MediaPlayer$prepareAsync()
.
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
W operacjach synchronicznych błędy są zwykle sygnalizowane za pomocą wyjątku lub kodu błędu, ale za każdym razem, gdy używasz zasobów asynchronicznych, upewnij się, że aplikacja jest odpowiednio powiadamiana o błędach. W przypadku 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
}
});
Pobieranie dzwonków systemowych
Ten przykład pokazuje, jak pobrać identyfikatory URI dzwonków systemowych ( 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;
}
Lista zależy od rodzaju żądanych dzwonków. Możliwości są następujące:
-
RingtoneManager.TYPE_RINGTONE
-
RingtoneManager.TYPE_NOTIFICATION
-
RingtoneManager.TYPE_ALARM
-
RingtoneManager.TYPE_ALL = TYPE_RINGTONE | TYPE_NOTIFICATION | TYPE_ALARM
Aby uzyskać dzwonki jako android.media.Ringtone
każdy Uri
musi zostać rozwiązany przez RingtoneManager
:
android.media.Ringtone osRingtone = RingtoneManager.getRingtone(context, uri);
Aby odtworzyć dźwięk, użyj metody:
public void setDataSource(Context context, Uri uri)
z android.media.MediaPlayer
. MediaPlayer
musi zostać zainicjowany i przygotowany zgodnie ze schematem stanu
Pobieranie i ustawianie głośności systemu
Typy strumienia audio
Istnieją różne profile strumieni dzwonków. Każdy z nich ma inną głośność.
Każdy przykład tutaj jest napisany dla typu strumienia AudioManager.STREAM_RING
. Nie jest to jednak jedyny. Dostępne typy strumieni to:
-
STREAM_ALARM
-
STREAM_DTMF
-
STREAM_MUSIC
-
STREAM_NOTIFICATION
-
STREAM_RING
-
STREAM_SYSTEM
-
STREAM_VOICE_CALL
Ustawianie głośności
Aby uzyskać objętość określonego profilu, zadzwoń:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);
Ta wartość jest bardzo mało przydatna, gdy maksymalna wartość dla strumienia nie jest znana:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int streamMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);
Stosunek tych dwóch wartości da względną objętość (0 <objętość <1):
float volume = ((float) currentVolume) / streamMaxVolume
Regulacja głośności o jeden krok
Aby zwiększyć głośność strumienia o jeden krok, wywołaj:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_RAISE, 0);
Aby zmniejszyć głośność strumienia o jeden krok, wywołaj:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_LOWER, 0);
Ustawienie MediaPlayer na używanie określonego typu strumienia
Do tego celu służy funkcja pomocnicza z klasy MediaPlayer
.
Wystarczy wywołać void setAudioStreamType(int streamtype)
:
MediaPlayer mMedia = new MediaPlayer();
mMedia.setAudioStreamType(AudioManager.STREAM_RING);
Odtwarzacz multimediów z postępem bufora i pozycją odtwarzania
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>
Zaimportuj dźwięk do androidstudio i odtwarzaj go
To jest przykład na to, jak odtworzyć plik audio, który już masz na komputerze / laptopie. Najpierw utwórz nowy katalog w res i nazwij go jako surowy tak
skopiuj audio, które chcesz odtworzyć do tego folderu. Może to być plik .mp3 lub .wav.
Teraz na przykład po kliknięciu przycisku chcesz odtworzyć ten dźwięk, oto jak to zrobić
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();
}
});
}
}
Spowoduje to odtworzenie utworu tylko raz po kliknięciu przycisku, jeśli chcesz odtworzyć utwór przy każdym kliknięciu przycisku, napisz kod w ten sposób
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();
}
});
}
}