Android
Reproductor multimedia
Buscar..
Sintaxis
- void setAudioStreamType (int streamtype)
- void setDataSource (contexto de contexto, uri uri)
- preparar el vacío ()
- void prepareAsync ()
- inicio vacío ()
- parada vacía ()
Observaciones
El uso de MediaPlayer
se basa principalmente en el diagrama de estado:
Eso significa que para reproducir audio / video debe ocurrir una secuencia de acción definida en un orden específico. También establece qué acciones se pueden hacer en qué estado .
La API de MediaPlayer carece de flexibilidad (agregando decodificador personalizado y lógica de representación) y carece de soporte para la transmisión dinámica adaptativa sobre HTTP (DASH) y SmoothStreaming. Para estos, mira en ExoPlayer .
Creación básica y juego.
La clase MediaPlayer se puede usar para controlar la reproducción de archivos y secuencias de audio / video.
La creación del objeto MediaPlayer puede ser de tres tipos:
Medios del recurso local
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.resource); mediaPlayer.start(); // no need to call prepare(); create() does that for you
De URI local (obtenido de ContentResolver)
Uri myUri = ....; // initialize Uri here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start();
Desde URL externa
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();
Preparación asíncrona
El MediaPlayer$prepare()
es una llamada de bloqueo y congelará la interfaz de usuario hasta que se complete la ejecución. Para resolver este problema, se puede usar 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
En las operaciones síncronas, los errores normalmente se señalarían con una excepción o un código de error, pero siempre que utilice recursos asíncronos, debe asegurarse de que se notifique a la aplicación de los errores de manera adecuada. Para 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
}
});
Obteniendo tonos del sistema
Este ejemplo muestra cómo obtener el URI de los tonos de llamada del 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;
}
La lista depende de los tipos de tonos de llamada solicitados. Las posibilidades son:
-
RingtoneManager.TYPE_RINGTONE
-
RingtoneManager.TYPE_NOTIFICATION
-
RingtoneManager.TYPE_ALARM
-
RingtoneManager.TYPE_ALL = TYPE_RINGTONE | TYPE_NOTIFICATION | TYPE_ALARM
Para obtener los tonos de llamada como android.media.Ringtone
todos los Uri
deben ser resueltos por el RingtoneManager
:
android.media.Ringtone osRingtone = RingtoneManager.getRingtone(context, uri);
Para reproducir el sonido, utiliza el método:
public void setDataSource(Context context, Uri uri)
Desde android.media.MediaPlayer
. MediaPlayer
debe inicializarse y prepararse de acuerdo con el diagrama de estado
Obtención y configuración del volumen del sistema.
Tipos de flujo de audio
Hay diferentes perfiles de secuencias de tonos de llamada. Cada uno de ellos tiene su volumen diferente.
Cada ejemplo aquí está escrito para AudioManager.STREAM_RING
tipo de flujo. Sin embargo, este no es el único. Los tipos de flujo disponibles son:
-
STREAM_ALARM
-
STREAM_DTMF
-
STREAM_MUSIC
-
STREAM_NOTIFICATION
-
STREAM_RING
-
STREAM_SYSTEM
-
STREAM_VOICE_CALL
Ajuste de volumen
Para obtener el volumen de perfil específico, llame a:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);
Este valor es muy poco útil, cuando se desconoce el valor máximo para la transmisión:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
int streamMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);
La relación de esos dos valores dará un volumen relativo (0 <volumen <1):
float volume = ((float) currentVolume) / streamMaxVolume
Ajustando el volumen en un solo paso
Para aumentar el volumen de la transmisión en un paso, llame a:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_RAISE, 0);
Para reducir el volumen de la transmisión en un solo paso, llame a:
AudioManager audio = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
audio.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_LOWER, 0);
Configuración de MediaPlayer para utilizar un tipo de transmisión específico
Hay una función auxiliar de la clase MediaPlayer
para hacer esto.
Simplemente llame a void setAudioStreamType(int streamtype)
:
MediaPlayer mMedia = new MediaPlayer();
mMedia.setAudioStreamType(AudioManager.STREAM_RING);
Reproductor multimedia con progreso de búfer y posición de juego
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>
Importar audio en androidstudio y reproducirlo
Este es un ejemplo de cómo reproducir un archivo de audio que ya tiene en su PC / computadora portátil. Primero cree un nuevo directorio en resolución y asígnele el nombre como crudo
Copie el audio que desea reproducir en esta carpeta. Puede ser un archivo .mp3 o .wav.
Ahora, por ejemplo, al hacer clic en el botón, desea reproducir este sonido, así es como se hace.
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();
}
});
}
}
Esto reproducirá la canción solo una vez cuando se haga clic en el botón, si desea reproducir la canción en cada botón, haga clic en el código de esta manera
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();
}
});
}
}