如何在Android中播放audio时显示MediaController?

如何在播放audio文件时显示MediaController ? 我正在创build一个MediaController的实例并调用其show()方法,但它不显示。 有没有可以帮助我解决这个问题?

以下是一个使用MediaPlayer和MediaController播放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(); } }); } } 

这是一个可以用于上面的代码的布局:

 <?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> 

我还没有足够的评论来评论,所以我不得不把这个作为一个答案。

@ user229487的答案

你需要添加mediaController.hide();onStop()方法。 如果你不这样做,而你碰巧在显示窗口时旋转窗口或closures窗口,你将得到一个Activity x has leaked window error

新的方法应该是这样的

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

我从user229487逐字复制上面的代码,但不能得到它的工作。 鉴于我是Android开发新手,我发现你需要把意图以及其他一些事情的困难方式。 我也不完全明白这个意图是如何与用户界面一起工作的(我是新来的),但是会对它起作用。

几乎没有像我这样的其他noobs的代码上面的代码工作(我至less得到它不会现在崩溃,并播放一首歌:)):

  • 没有这个不会编译:

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

  • 手动设置audio:(换行:)

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

  • 设置意图
    添加以下行: this.getIntent().putExtra(AUDIO_FILE_NAME,AUDIO_FILE_NAME);
    在此行之前: audioFile = this.getIntent().getStringExtra(AUDIO_FILE_NAME);

现在应该编译和播放歌曲。

我不能评论…所以我写在这里。 上面的代码非常好。 我只需要拿出来

mediaPlayer.prepare();

在尝试抓住位,否则活动会崩溃。 不知道这一点应该做什么,没有它,它工作得很好。 谢谢!!