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:

wprowadź opis zdjęcia tutaj

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:

  1. Media z lokalnego zasobu

    MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.resource);
    mediaPlayer.start(); // no need to call prepare(); create() does that for you
    
  2. 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();
    
  3. 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

to

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();
     }
   });
 }
}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow