Android
Media Player
Ricerca…
Sintassi
- void setAudioStreamType (int streamtype)
- void setDataSource (Contesto contesto, Uri uri)
- vuoto prepara ()
- void prepareAsync ()
- void start ()
- void stop ()
Osservazioni
L'utilizzo di MediaPlayer
si basa principalmente sul diagramma dello stato:
Ciò significa che per riprodurre audio / video è necessario che una determinata sequenza di azioni avvenga in un ordine specifico. Indica anche quali azioni possono essere fatte in quale stato .
L'API di MediaPlayer non ha flessibilità (aggiunta di decoder e logica di rendering personalizzati) e manca sSupport per Dynamic Adaptive Streaming su HTTP (DASH) e SmoothStreaming. Per questi, guarda in ExoPlayer .
Creazione e riproduzione di base
La classe MediaPlayer può essere utilizzata per controllare la riproduzione di file e flussi audio / video.
La creazione dell'oggetto MediaPlayer può essere di tre tipi:
Media dalla risorsa locale
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.resource); mediaPlayer.start(); // no need to call prepare(); create() does that for you
Dall'URI locale (ottenuto da ContentResolver)
Uri myUri = ....; // initialize Uri here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start();
Da URL esterno
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();
Preparazione asincrona
MediaPlayer$prepare()
è una chiamata bloccante e bloccherà l'interfaccia utente fino al completamento dell'esecuzione. Per risolvere questo problema, è possibile utilizzare 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
Nelle operazioni sincrone, gli errori vengono normalmente segnalati con un'eccezione o un codice di errore, ma ogni volta che si utilizzano risorse asincrone, è necessario assicurarsi che l'applicazione venga notificata correttamente degli errori. Per 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
}
});
Ottenere suonerie di sistema
Questo esempio mostra come recuperare l'URI delle suonerie di sistema ( 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;
}
L'elenco dipende dal tipo di suoneria richiesta. Le possibilità sono:
-
RingtoneManager.TYPE_RINGTONE
-
RingtoneManager.TYPE_NOTIFICATION
-
RingtoneManager.TYPE_ALARM
-
RingtoneManager.TYPE_ALL = TYPE_RINGTONE | TYPE_NOTIFICATION | TYPE_ALARM
Per ottenere le suonerie come android.media.Ringtone
ogni Uri
deve essere risolto dal RingtoneManager
:
android.media.Ringtone osRingtone = RingtoneManager.getRingtone(context, uri);
Per riprodurre il suono, utilizzare il metodo:
public void setDataSource(Context context, Uri uri)
da android.media.MediaPlayer
. MediaPlayer
deve essere inizializzato e preparato secondo il diagramma di stato
Ottenere e impostare il volume del sistema
Tipi di flusso audio
Esistono diversi profili di flussi di suonerie. Ognuno di loro ha il suo volume diverso.
Ogni esempio qui è scritto per il tipo di flusso AudioManager.STREAM_RING
. Tuttavia questo non è l'unico. I tipi di flusso disponibili sono:
-
STREAM_ALARM
-
STREAM_DTMF
-
STREAM_MUSIC
-
STREAM_NOTIFICATION
-
STREAM_RING
-
STREAM_SYSTEM
-
STREAM_VOICE_CALL
Impostazione del volume
Per ottenere il volume del profilo specifico, chiama:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);
Questo valore è molto poco utile, quando il valore massimo per il flusso non è noto:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int streamMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);
Il rapporto tra questi due valori darà un volume relativo (0 <volume <1):
float volume = ((float) currentVolume) / streamMaxVolume
Regolazione del volume di un passo
Per aumentare il volume dello stream di un passo, chiama:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_RAISE, 0);
Per ridurre il volume dello stream di un passo, chiama:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_LOWER, 0);
Impostazione di MediaPlayer per utilizzare il tipo di stream specifico
Per fare ciò è disponibile una funzione di supporto dalla classe MediaPlayer
.
Basta chiamare void setAudioStreamType(int streamtype)
:
MediaPlayer mMedia = new MediaPlayer();
mMedia.setAudioStreamType(AudioManager.STREAM_RING);
Lettore multimediale con avanzamento del buffer e posizione di riproduzione
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>
Importa audio in Androidstudio e riproducilo
Questo è un esempio di come ottenere la riproduzione di un file audio che hai già sul tuo pc / laptop. Per prima cosa crea una nuova directory sotto res e chiamala come raw come questa
copia l'audio che vuoi riprodurre in questa cartella. Può essere un file .mp3 o .wav.
Ora, ad esempio, sul pulsante clic si desidera riprodurre questo suono, ecco come è fatto
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();
}
});
}
}
Questo riprodurrà la canzone solo una volta quando si fa clic sul pulsante, se si desidera riprodurre la canzone su ogni pulsante, fare clic su un codice di scrittura come questo
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();
}
});
}
}