編輯:關於Android編程
Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video兩個應用程序都是調用MediaPlayer實現的。
MediaPlayer在底層是基於OpenCore(PacketVideo)的庫實現的,為了構建一個MediaPlayer程序,上層還包含了進程間通訊等內容,這種進程間通訊的基礎是Android基本庫中的Binder機制。
首先我們的播放器可能不只是希望播放一種格式的音樂,而且還需要自動識別指定的路徑中哪些是可以播放的音頻文件,哪些是不支持的格式,我們可以通過下面的代碼來過濾文件類型:
Java代碼
class MusicFilter implements FilenamFilter{
public boolean accept(File dir,String name){
return(name.endWith(".mps3"));
}
}
現在我們已經得到了能夠播放的音頻文件,如何來實現一個播放列表的界面呢?本例我們使用ListActivity布局來實現。但是我們還需要幾個按鈕來表示開始、暫停等操作,我們使用ImageButton來實現,下面是我們的播放器的界面。
現在我們需要指定音樂文件的位置,本例我們設置路徑為“/sdcard/”,因此我們需要向SD卡中添加音頻文件。步驟如下:啟動模擬器,在Eclipse上選擇DDMS窗口,選擇File Explorer標簽,向左、向右箭頭分別是拷貝進、拷貝出指定位置,減號則是刪除選中的文件。
現在我們只需要設置這些ImageButton按鈕的時間來處理相應的動作即可播放音樂,首先調用Reset(),這樣做將重置MediaPlayer到它的正常狀態,這是必須的。如果正在放一首歌曲,同事又想去改變這個數據源,這個Reset()功能也將停止任何正在播放的歌曲。因此,如果一首歌曲是播放狀態,同事我們又要選擇另一首歌曲,那麼它將在啟動下一首歌曲之前停止這首正在播放的歌曲。然後我們通過路徑找到這首歌曲(setDataSource(String))同事調用prepare()和Start()。在這裡指向MediaPlayer將啟動播放你的歌曲。接下來的工作就是去裝備一個OnCompletionLister(setOnCompletionListener(newOnCompletionListener())).在歌曲結束的時候,onCompletion(MediaPlayer)這個功能將被調用。比如我們可以在這裡設置自動播放下一首歌曲。下面我們老看看具體的實現代碼。
Java代碼
package com.yarin.android.Examples_07_01;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import android.app.ListActivity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
public class Activity01 extends ListActivity
{
/* 幾個操作按鈕 */
private ImageButton mFrontImageButton = null;
private ImageButton mStopImageButton = null;
private ImageButton mStartImageButton = null;
private ImageButton mPauseImageButton = null;
private ImageButton mNextImageButton = null;
/* MediaPlayer對象 */
public MediaPlayer mMediaPlayer = null;
/* 播放列表 */
private List<String> mMusicList = new ArrayList<String>();
/* 當前播放歌曲的索引 */
private int currentListItme = 0;
/* 音樂的路徑 */
private static final String MUSIC_PATH = new String("/sdcard/");
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* 更新顯示播放列表 */
musicList();
/* 構建MediaPlayer對象 */
mMediaPlayer = new MediaPlayer();
mFrontImageButton = (ImageButton) findViewById(R.id.LastImageButton);
mStopImageButton = (ImageButton) findViewById(R.id.StopImageButton);
mStartImageButton = (ImageButton) findViewById(R.id.StartImageButton);
mPauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton);
mNextImageButton = (ImageButton) findViewById(R.id.NextImageButton);
//停止按鈕
mStopImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
@Override
public void onClick(View v)
{
/* 是否正在播放 */
if (mMediaPlayer.isPlaying())
{
//重置MediaPlayer到初始狀態
mMediaPlayer.reset();
}
}
});
//開始按鈕
mStartImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
@Override
public void onClick(View v)
{
playMusic(MUSIC_PATH + mMusicList.get(currentListItme));
}
});
//暫停
mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
public void onClick(View view)
{
if (mMediaPlayer.isPlaying())
{
/* 暫停 */
mMediaPlayer.pause();
}
else
{
/* 開始播放 */
mMediaPlayer.start();
}
}
});
//下一首
mNextImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
@Override
public void onClick(View arg0)
{
nextMusic();
}
});
//上一首
mFrontImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
@Override
public void onClick(View arg0)
{
FrontMusic();
}
});
}
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if ( keyCode == KeyEvent.KEYCODE_BACK)
{
mMediaPlayer.stop();
mMediaPlayer.release();
this.finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
/* 當我們點擊列表時,播放被點擊的音樂 */
protected void onListItemClick(ListView l, View v, int position, long id)
{
currentListItme = position;
playMusic(MUSIC_PATH + mMusicList.get(position));
}
/* 播放列表 */
public void musicList()
{
//取得指定位置的文件設置顯示到播放列表
File home = new File(MUSIC_PATH);
if (home.listFiles(new MusicFilter()).length > 0)
{
for (File file : home.listFiles(new MusicFilter()))
{
mMusicList.add(file.getName());
}
ArrayAdapter<String> musicList = new ArrayAdapter<String>(Activity01.this,R.layout.musicitme, mMusicList);
setListAdapter(musicList);
}
}
private void playMusic(String path)
{
try
{
/* 重置MediaPlayer */
mMediaPlayer.reset();
/* 設置要播放的文件的路徑 */
mMediaPlayer.setDataSource(path);
/* 准備播放 */
mMediaPlayer.prepare();
/* 開始播放 */
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(new OnCompletionListener()
{
public void onCompletion(MediaPlayer arg0)
{
//播放完成一首之後進行下一首
nextMusic();
}
});
}catch (IOException e){}
}
/* 下一首 */
private void nextMusic()
{
if (++currentListItme >= mMusicList.size())
{
currentListItme = 0;
}
else
{
playMusic(MUSIC_PATH + mMusicList.get(currentListItme));
}
}
/* 上一首 */
private void FrontMusic()
{
if (--currentListItme >= 0)
{
currentListItme = mMusicList.size();
}
else
{
playMusic(MUSIC_PATH + mMusicList.get(currentListItme));
}
}
}
/* 過濾文件類型 */
class MusicFilter implements FilenameFilter
{
public boolean accept(File dir, String name)
{
//這裡還可以設置其他格式的音樂文件
return (name.endsWith(".mp3"));
}
}
現在我們已經知道如何播放指定SD卡上的音樂了,但是大家是否想到,我們在應用時(比如游戲中的音效),肯定是需要和我們的程序一起打包發布的,這樣音樂就沒有存在於SD卡上了,一般情況下會放在應用的目錄下的“res\raw\”中,那麼如何播放這樣的音樂呢,其實很簡單,只需要把上面的例子中的setDataSource 方法改成有create方法來創建一個指定的資源索引的MediaPlayer對象,其他操作基本一。代碼如下:
Java代碼
package com.yarin.android.Examples_07_02;
import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
public class Activity01 extends Activity
{
private ImageButton mStopImageButton;
private ImageButton mStartImageButton;
private ImageButton mPauseImageButton;
private TextView mTextView;
private boolean bIsReleased = false;
private boolean bIsPaused = false;
private boolean bIsPlaying = false;
public MediaPlayer mMediaPlayer = new MediaPlayer(); ;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mStopImageButton = (ImageButton) findViewById(R.id.StopImageButton);
mStartImageButton = (ImageButton) findViewById(R.id.StartImageButton);
mPauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton);
mTextView = (TextView) findViewById(R.id.TextView01);
//停止按鈕
mStopImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
@Override
public void onClick(View v)
{
if (bIsPlaying == true)
{
if ( !bIsReleased )
{
mMediaPlayer.stop();
mMediaPlayer.release();
bIsReleased = true;
}
bIsPlaying = false;
mTextView.setText("當前處於停止狀態,請按開始進行音樂播放!");
}
}
});
//開始按鈕
mStartImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
@Override
public void onClick(View v)
{
try
{
if ( !bIsPlaying )
{
bIsPlaying = true;
/* 裝載資源中的音樂 */
mMediaPlayer = MediaPlayer.create(Activity01.this, R.raw.test);
bIsReleased = false;
/* 設置是否循環 */
mMediaPlayer.setLooping(true);
try
{
mMediaPlayer.prepare();
}
catch (IllegalStateException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
mMediaPlayer.start();
mTextView.setText("當前正在播放音樂!");
}
}
catch (IllegalStateException e)
{
e.printStackTrace();
}
mMediaPlayer.setOnCompletionListener(new OnCompletionListener()
{
// @Override
public void onCompletion(MediaPlayer arg0)
{
mMediaPlayer.release();
}
});
}
});
//暫停
mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener()
{
public void onClick(View view)
{
if (mMediaPlayer != null)
{
if (bIsReleased == false)
{
if (bIsPaused == false)
{
mMediaPlayer.pause();
bIsPaused = true;
bIsPlaying = true;
mTextView.setText("已經暫停,請再次按暫停按鈕回復播放!");
}
else if (bIsPaused == true)
{
mMediaPlayer.start();
bIsPaused = false;
mTextView.setText("音樂恢復播放!");
}
}
}
}
});
}
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if ( keyCode == KeyEvent.KEYCODE_BACK)
{
if ( !bIsReleased )
{
mMediaPlayer.stop();
mMediaPlayer.release();
bIsReleased = true;
}
this.finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
細心的讀者已經發現create方法不僅可以加載應用程序中資源的索引,還可加載一個URI地址,當然這就說明我們同樣可以很輕松地播放網絡音樂,核心代碼如下:
Java代碼
Private MediaPlayer mMediaPlayer;
Uri uri=Uri.parse("http://www.xxx.com.xxx.mp3");
mMediaPlayer=MediaPlayer.create(this,uri);
mMediaPlayer.start();
前言當前的網絡開源庫有許多,如volley,okhttp,retrofit等,這三個庫當前是比較火的,其中,okhttp和retrofit由square團隊開發。關於這三
優步在線客服怎麼聯系?優步怎麼聯系客服?如果你不在撥打優步客服電話沒人接時,是不是會很心煩呢?沒關系,優步不僅有客服電話,還提供在線客服咨詢哦!下載吧小編為
已經到了燥熱的暑氣在體內積聚的季節,我們的智能手機也同樣對熱沒什麼抵抗力。在用手機的時候,電池和儲存器就會出現發熱的狀況。這種熱量積聚,不僅會導致手機運行變
2014的 google i/o發表令多數人為之一亮的 material design toolbar,這是用來取代過去 actionbar 的控件,而現在於 mater