Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 小音頻頻繁播放

android 小音頻頻繁播放

編輯:關於Android編程

android中多媒體文件(音樂和視頻)的播放是用MediaPlayer方式是大家比較熟悉的,但是現在要來說一下另外一種音樂文件播放的方式SoundPool,相比較而言,用MediaPlayer來播放音樂的話,占用的系統資源是很多的,加載資源也需要時間,所以它不適合用來頻繁播放小音頻文件,比如控件焦點、點擊時需要播放小音頻文件,這個時候用SoundPool來播放音頻文件,比用MediaPlayer來播放效率要高很多。這裡也來說說,如果用MediaPlayer來播放小音頻文件的話,會出現延時,點擊了之後等會兒才出現聲音。所以,SoundPool比MediaPlayer更輕量級,適合用於頻繁播放的小音頻文件。

下面就來說說它的用法:

第一步:放置目標音頻文件
將音頻文件放在res/raw目錄下,這樣就可以通過R來引用它了。如果想放在Assert目錄下也是可以的,這裡先放在raw下。
第二步:編寫音頻播放的類

public class MusicPlayer {
	private Context mContext ;
	private static MusicPlayer sInstance ;
	static class Type{
		public final static int MUSIC_CLICK = 1 ;
		public final static int MUSIC_FOCUSED = 2 ;
	}
	private SoundPool mSp  ;
	private Map sSpMap ;
	private MusicPlayer(Context context){
		mContext = context ;
		sSpMap = new TreeMap() ;
		mSp = new SoundPool(10 ,AudioManager.STREAM_MUSIC ,100) ;
		sSpMap.put(Type.MUSIC_CLICK, mSp.load(mContext, R.raw.click, 1)) ;
		sSpMap.put(Type.MUSIC_FOCUSED, mSp.load(mContext, R.raw.focused, 1)) ;
	}
	
	public static MusicPlayer getInstance(Context context){
		if(sInstance == null)
			sInstance = new MusicPlayer(context) ;
		return sInstance ;
	}
	
	public void play(int type){
		if(sSpMap.get(type) == null) return ;
		mSp.play(sSpMap.get(type), 1, 1, 0, 0, 1) ;
	}
}

第三步:調用接口,播放音頻
// 在界面上需要這樣調用
// 初始化
mMusic = MusicPlayer.getInstance(MainActivity.this) ;
// 在onClick中播放click時的聲音
mMusic.play(MusicPlayer.Type.MUSIC_CLICK) ;
// 在onFocusChange中聚焦狀態播放聚焦的聲音
mMusic.play(MusicPlayer.Type.MUSIC_FOCUSED) ;


如果想放在Assert中的話,要注意在引用音頻文件時要用AssetFileDescriptor,具體方式如下:
MediaPlayer mMediaPlayer = new MediaPlayer() ; 
	AssetFileDescriptor fd = mContext.getAssets().openFd(“music/click.pm3”) ; // assert目錄下的music目錄
	mMediaPlayer.setDataSource(fd.getFileDescriptor() ,fd.getStartOffset() ,fd.getLength()) ;
	mMediaPlayer.prepare() ;
	mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
		@Override
		public void onCompletion(MediaPlayer arg0) {
			mMediaPlayer.release() ;
		}
	}) ;
	mMediaPlayer.setOnErrorListener(new OnErrorListener() {
		@Override
		public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
			mMediaPlayer.release() ;
			return false;
		}
	}) ;
	mMediaPlayer.start() ;

注意:在用MediaPlayer時要記住釋放資源!在兩個回調接口中實現。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved