2010-09-19 11 views
35

¿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?¿Cómo puedo mostrar un MediaController mientras reproduzco audio en Android?

+9

hay un icono al lado de la calificación de cada respuesta (en el lado izquierdo, lo verá), simplemente haga clic en él – Lope

+6

Por favor, acepte una de las siguientes respuestas. Ayuda a mostrar aprecio por las personas que se tomaron el tiempo para responder a su pregunta. – Pieter

Respuesta

91

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í está un diseño que se puede utilizar 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> 
+0

¿Alguien ha intentado el código anterior ?, no funciona, no escucho el sonido ni el programa de audio, sí, definí 'AUDIO_FILE_NAME 'algo así como" mysite.com/talk/1.mp3 " –

+0

Gracias, esto me ayudó mucho !!! – krisDrOid

+0

Yo (por fin) arreglé el método onStop como lo sugirió @ jp36. Gracias por la corrección @ jp36! – user229487

18

Todavía no tengo representante suficiente en comentar así que tengo que acaba de publicar esto como una respuesta.

@ respuesta de user229487

es necesario agregar mediaController.hide(); al método onStop(). Si no se hace esto y le sucede a girar la ventana o cierra la ventana mientras se está mostrando obtendrá un error de Activity x has leaked window

Nuevo método debería tener este aspecto

@Override 
protected void onStop() { 
    super.onStop(); 
    mediaController.hide(); 
    mediaPlayer.stop(); 
    mediaPlayer.release(); 
} 
1

He copiado el código anterior de user229487 textualmente pero no pudo 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 obtener el código anterior para trabajar (yo por lo menos tengo a no chocar ahora y reproducir una canción :)):

  • no se compilará sin que esto:

    @Override
    public int getAudioSessionId() {
    return 0;
    }

  • para configurar manualmente de audio: (línea de cambio a :)

    public static final String AUDIO_FILE_NAME = Environment.getExternalStorageDirectory()+"/MusicFolder/Song.mp3";

  • Configuración intención
    añadir esta línea: this.getIntent().putExtra(AUDIO_FILE_NAME,AUDIO_FILE_NAME);
    Antes de esta línea: audioFile = this.getIntent().getStringExtra(AUDIO_FILE_NAME);

debe recopilar y reproducir la canción ahora.

0

Todavía no tengo permitido comentar ... por lo tanto escribo aquí. El código anterior es excelente. Solo necesitaba sacar el

mediaPlayer.prepare();

mordió la captura de prueba; de lo contrario, la actividad se interrumpiría. No estoy seguro de qué debe hacer este bit, está funcionando muy bien sin él. ¡¡Gracias!!

Cuestiones relacionadas