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:

Geben Sie hier die Bildbeschreibung ein

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:

  1. Medien aus lokaler Ressource

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

diese

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow