Android
Mediaspeler
Zoeken…
Syntaxis
- void setAudioStreamType (int streamtype)
- void setDataSource (Context context, Uri uri)
- void prepare ()
- void prepareAsync ()
- ongeldige start ()
- ongeldige stop ()
Opmerkingen
Het gebruik van MediaPlayer
is voornamelijk gebaseerd op het statusdiagram:
Dat betekent dat om een audio / video af te spelen een specifieke volgorde van actie moet plaatsvinden. Het geeft ook aan welke acties in welke staat kunnen worden uitgevoerd .
De MediaPlayer API mist flexibiliteit (toevoeging van aangepaste decoder en renderinglogica) en mist sSupport voor Dynamic Adaptive Streaming via HTTP (DASH) en SmoothStreaming. Kijk hiervoor in ExoPlayer .
Basis creatie en spelen
De klasse MediaPlayer kan worden gebruikt om het afspelen van audio- / videobestanden en streams te regelen.
Het maken van het MediaPlayer-object kan drie soorten zijn:
Media van lokale bronnen
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.resource); mediaPlayer.start(); // no need to call prepare(); create() does that for you
Van lokale URI (verkregen van ContentResolver)
Uri myUri = ....; // initialize Uri here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start();
Van externe 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();
Asynchroon voorbereiden
De MediaPlayer$prepare()
is een blokkerende oproep en bevriest de gebruikersinterface totdat de uitvoering is voltooid. Om dit probleem op te lossen, kan MediaPlayer$prepareAsync()
worden gebruikt.
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
Bij synchrone bewerkingen worden fouten normaal gesproken met een uitzondering of een foutcode gemeld, maar wanneer u asynchrone bronnen gebruikt, moet u ervoor zorgen dat uw toepassing op de juiste wijze op de hoogte wordt gesteld. Voor 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
}
});
Systeembeltonen krijgen
Dit voorbeeld laat zien hoe u de URI's van systeembeltonen kunt ophalen ( 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;
}
De lijst is afhankelijk van het type gevraagde beltonen. De mogelijkheden zijn:
-
RingtoneManager.TYPE_RINGTONE
-
RingtoneManager.TYPE_NOTIFICATION
-
RingtoneManager.TYPE_ALARM
-
RingtoneManager.TYPE_ALL = TYPE_RINGTONE | TYPE_NOTIFICATION | TYPE_ALARM
Om de Ringtones als android.media.Ringtone
te krijgen, moet elke Uri
door de RingtoneManager
worden opgelost:
android.media.Ringtone osRingtone = RingtoneManager.getRingtone(context, uri);
Gebruik de methode om het geluid af te spelen:
public void setDataSource(Context context, Uri uri)
van android.media.MediaPlayer
. MediaPlayer
moet worden geïnitialiseerd en voorbereid volgens het statusdiagram
Systeemvolume ophalen en instellen
Typen audiostreams
Er zijn verschillende profielen voor beltoonstreams. Elk van hen heeft zijn eigen volume.
Elk voorbeeld hier is geschreven voor AudioManager.STREAM_RING
. Dit is echter niet de enige. De beschikbare streamsoorten zijn:
-
STREAM_ALARM
-
STREAM_DTMF
-
STREAM_MUSIC
-
STREAM_NOTIFICATION
-
STREAM_RING
-
STREAM_SYSTEM
-
STREAM_VOICE_CALL
Volume instellen
Bel voor het volume van een specifiek profiel:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);
Deze waarde is erg weinig nuttig, wanneer de maximale waarde voor de stream niet bekend is:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int streamMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);
De verhouding tussen die twee waarden geeft een relatief volume (0 <volume <1):
float volume = ((float) currentVolume) / streamMaxVolume
Volume aanpassen met één stap
Als u het volume voor de stream één stap hoger wilt zetten, belt u:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_RAISE, 0);
Als u het volume voor de stream één stap lager wilt zetten, belt u:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_LOWER, 0);
MediaPlayer instellen om een specifiek streamtype te gebruiken
Er is een helpfunctie van de MediaPlayer
klasse om dit te doen.
Bel gewoon void setAudioStreamType(int streamtype)
:
MediaPlayer mMedia = new MediaPlayer();
mMedia.setAudioStreamType(AudioManager.STREAM_RING);
Mediaspeler met buffervoortgang en afspeelpositie
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>
Importeer audio in androidstudio en speel het
Dit is een voorbeeld om een audiobestand af te spelen dat je al op je pc / laptop hebt. Maak eerst een nieuwe map onder res en noem deze zo rauw als deze
kopieer de audio die u wilt afspelen naar deze map. Het kan een .mp3- of .wav-bestand zijn.
Nu wilt u bijvoorbeeld bij het klikken op een knop dit geluid afspelen, hier is hoe het is gedaan
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();
}
});
}
}
Hiermee wordt het nummer slechts eenmaal afgespeeld wanneer op de knop wordt geklikt. Als u het nummer op elke knop opnieuw wilt afspelen, klikt u op code schrijven zoals deze
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();
}
});
}
}