videos - ¿Cómo puedo mostrar un MediaController mientras reproduzco audio en Android?
reproductor de audio y video android studio (4)
Aquí hay un ejemplo de una actividad que usa MediaPlayer y MediaController para reproducir audio.
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.media.MediaPlayer.OnPreparedListener;
import android.view.MotionEvent;
import android.widget.MediaController;
import android.widget.TextView;
import java.io.IOException;
public class AudioPlayer extends Activity implements OnPreparedListener, MediaController.MediaPlayerControl{
private static final String TAG = "AudioPlayer";
public static final String AUDIO_FILE_NAME = "audioFileName";
private MediaPlayer mediaPlayer;
private MediaController mediaController;
private String audioFile;
private Handler handler = new Handler();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.audio_player);
audioFile = this.getIntent().getStringExtra(AUDIO_FILE_NAME);
((TextView)findViewById(R.id.now_playing_text)).setText(audioFile);
mediaPlayer = new MediaPlayer();
mediaPlayer.setOnPreparedListener(this);
mediaController = new MediaController(this);
try {
mediaPlayer.setDataSource(audioFile);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
Log.e(TAG, "Could not open file " + audioFile + " for playback.", e);
}
}
@Override
protected void onStop() {
super.onStop();
mediaController.hide();
mediaPlayer.stop();
mediaPlayer.release();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//the MediaController will hide after 3 seconds - tap the screen to make it appear again
mediaController.show();
return false;
}
//--MediaPlayerControl methods----------------------------------------------------
public void start() {
mediaPlayer.start();
}
public void pause() {
mediaPlayer.pause();
}
public int getDuration() {
return mediaPlayer.getDuration();
}
public int getCurrentPosition() {
return mediaPlayer.getCurrentPosition();
}
public void seekTo(int i) {
mediaPlayer.seekTo(i);
}
public boolean isPlaying() {
return mediaPlayer.isPlaying();
}
public int getBufferPercentage() {
return 0;
}
public boolean canPause() {
return true;
}
public boolean canSeekBackward() {
return true;
}
public boolean canSeekForward() {
return true;
}
//--------------------------------------------------------------------------------
public void onPrepared(MediaPlayer mediaPlayer) {
Log.d(TAG, "onPrepared");
mediaController.setMediaPlayer(this);
mediaController.setAnchorView(findViewById(R.id.main_audio_view));
handler.post(new Runnable() {
public void run() {
mediaController.setEnabled(true);
mediaController.show();
}
});
}
}
Aquí hay un diseño que puede usarse con el código anterior:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_audio_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Now playing:"
android:textSize="25sp"
android:textStyle="bold"
/>
<TextView
android:id="@+id/now_playing_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dip"
android:layout_marginLeft="10dip"
android:layout_marginRight="10dip"
android:layout_gravity="center"
android:text="Now playing.."
android:textSize="16sp"
android:textStyle="italic"
/>
</LinearLayout>
¿Cómo puedo mostrar un MediaController
mientras reproduzco un archivo de audio? Estoy creando una instancia de MediaController
y llamando a su método show()
, pero no se muestra. ¿Puede alguien ayudarme a resolver este problema?
Copié literalmente el código de user229487 pero no pude hacerlo funcionar. Teniendo en cuenta que soy nuevo en el desarrollo de Android, me di cuenta de la manera más difícil en que necesita poner un intento, así como algunas otras cosas. Tampoco entiendo exactamente cómo funcionará la intención con una interfaz de usuario (nuevamente soy nuevo), pero trabajaré en ello.
Pocas cosas para otros noobs como yo para que funcione el código de arriba (por lo menos lo tengo para no colgar ahora y reproducir una canción :)):
No compilará sin esto:
@Override
public int getAudioSessionId() {
return 0;
}Para configurar el audio manualmente: (cambie la línea a :)
public static final String AUDIO_FILE_NAME = Environment.getExternalStorageDirectory()+"/MusicFolder/Song.mp3";
Intento de instalación
Agregue esta línea:this.getIntent().putExtra(AUDIO_FILE_NAME,AUDIO_FILE_NAME);
Antes de esta línea:audioFile = this.getIntent().getStringExtra(AUDIO_FILE_NAME);
Debería compilar y reproducir la canción ahora.
Todavía no puedo comentar ... por lo tanto escribo aquí. El código anterior es excelente. Solo necesitaba sacar el
mediaPlayer.prepare ();
poco en la captura de prueba, de lo contrario, la actividad se bloqueará. No estoy seguro de lo que debería hacer este bit, está funcionando muy bien sin él. ¡¡Gracias!!
Todavía no tengo suficientes representantes para Comment, así que solo tengo que publicar esto como respuesta.
@ user229487''s answer
necesita agregar mediaController.hide();
al método onStop()
. Si no haces esto y giras la ventana o cierras la ventana mientras se muestra, obtendrás una Activity x has leaked window
error de Activity x has leaked window
El nuevo método debería verse así
@Override
protected void onStop() {
super.onStop();
mediaController.hide();
mediaPlayer.stop();
mediaPlayer.release();
}