2010-09-19 47 views
35

如何在播放音頻文件時顯示MediaController?我正在創建一個MediaController的實例並調用它的show()方法,但未顯示。 有沒有可以幫助我解決這個問題?如何在Android中播放音頻時顯示MediaController?

+9

每個答案的評分旁邊都有刻度線圖標(在左邊,你會看到它),只需點擊它 – Lope 2011-08-10 19:28:03

+6

請接受下面的答案之一。它有助於對花時間回答您的問題的人們表示一些讚賞。 – Pieter 2012-06-03 13:02:08

回答

91

以下是使用MediaPlayer和MediaController播放音頻的活動示例。

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> 
+0

有沒有人試過上面的代碼?,它不工作,我沒有聽到音頻聲音或顯示,是我定義了'AUDIO_FILE_NAME'這樣的事情「mysite.com/talk/1.mp3」 – 2012-01-17 03:27:21

+0

謝謝這幫助我很多! – krisDrOid 2012-02-29 14:00:02

+0

我(最後)修正了@ jp36建議的onStop方法。感謝@ jp36的更正! – user229487 2013-06-15 21:12:59

18

我還沒有足夠的代表評論,所以我不得不只是張貼這是一個答案。

@ user229487的回答

你需要添加mediaController.hide();onStop()方法。如果你不這樣做,你碰巧旋轉窗口或關閉窗口,它顯示的同時,你會得到一個錯誤Activity x has leaked window

新的方法應該是這樣的

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

我複製上面的代碼從user229487逐字,但無法得到它的工作。鑑於我是Android開發新手,我發現了你需要付出意圖以及其他一些事情的難題。我也不完全理解這個意圖是如何與用戶界面一起工作的(我是新來的),但是會對它起作用。

其他菜鳥一樣我很少有東西讓上面的代碼工作(我至少得到它現在不崩潰,播放一首歌曲:)):

  • 沒有這不會編譯:

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

  • 要設置手動音頻:(變更線:)

    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);

應該編譯現在播放歌曲。

0

我還沒有被允許發表評論...因此,我寫在這裏。 上面的代碼非常好。我只需要取出

mediaPlayer.prepare();

位在嘗試捕捉,否則活動將崩潰。不知道這一點應該做什麼,沒有它,它工作得很好。謝謝!!

相關問題