最近在看Android多媒体相关的资料,发现在1.0-r2版本支持的音频格式amr、mp3、wav、mid,不支持aac格式,Android提供的MediaPlayer不支持类似J2me那样的流直接创建模式,而流创建显然是我们开发中最常用的模式,如我们到远程服务器下载音频、视频数据一般都是流的形式,如何使用流创建MediaPlayer呢?下面的代码是关于创建MediaPlayer的几种使用形式。

/**
* MedaiaPlayer的使用<br>
* <b>注意:</b>在实际的开发中要写一个后台服务(Service)来控制 #@see Android Source
* Music/src/com/android/music/MediaPlaybackService.java
*
* @author shenrenkui
*
*/
public class MediaPlayerDemo extends Activity {
private Button resButton;
private Button localFileButton;
private Button netUrlButton;
private Button streamButton;
private MediaPlayer mMediaPlayer;
private Context mContext;

public void onCreate(Bundle state) {
super.onCreate(state);
mContext = this;
this.setContentView(R.layout.mediaplayerdemo);

resButton = (Button) this.findViewById(R.id.res);
localFileButton = (Button) this.findViewById(R.id.localFile);
netUrlButton = (Button) this.findViewById(R.id.netUrl);
streamButton = (Button) this.findViewById(R.id.stream);

resButton.setOnClickListener(buttonListener);
localFileButton.setOnClickListener(buttonListener);
netUrlButton.setOnClickListener(buttonListener);
streamButton.setOnClickListener(buttonListener);

}

/**
* Button事件响应接口
*/
private OnClickListener buttonListener = new OnClickListener() {
public void onClick(View v) {
try {
if (resButton.equals(v)) {
releaseMediaPlayer();
mMediaPlayer = MediaPlayer.create(mContext,
R.raw.leave_out_all_the_rest);
mMediaPlayer.start();

} else if (localFileButton.equals(v)) {
Uri playUri = Uri.parse("/sdcard/download/mp3.mp3");
releaseMediaPlayer();
mMediaPlayer = MediaPlayer.create(mContext, playUri);
mMediaPlayer.start();

} else if (netUrlButton.equals(v)) {
releaseMediaPlayer();
//不得已而为之的办法
Uri playUri = Uri
.parse("http://music.isohuo.com/2282/a3dca6eabba74bbd8c46b23e6dddfe43.mp3");
mMediaPlayer = MediaPlayer.create(mContext, playUri);
mMediaPlayer.start();

} else if (streamButton.equals(v)) {
releaseMediaPlayer();
mMediaPlayer = create(mContext,
R.raw.leave_out_all_the_rest);
mMediaPlayer.start();

}
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
};

private MediaPlayer create(Context context, int resid) {
InputStream stream = context.getResources().openRawResource(resid);
if (stream != null)
return create(context, stream);
else
return null;
}

private MediaPlayer create(Context context, InputStream stream) {
MediaPlayer mediaplayer = null;
try {
File temp = File.createTempFile("mediaplayertmp", "temp");
String tempPath = temp.getAbsolutePath();
FileOutputStream out = new FileOutputStream(temp);
//用BufferdOutputStream速度快
BufferedOutputStream bis = new BufferedOutputStream(out);
byte buf[] = new byte[128];
do {
int numread = stream.read(buf);
if (numread <= 0)
break;
bis.write(buf, 0, numread);
} while (true);
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(tempPath);
mp.prepare();
mediaplayer = mp;
} catch (Exception e) {
e.printStackTrace();
}
return mediaplayer;
}

/**
* 释放上一次MediaPlayer资源
*/
private void releaseMediaPlayer() {
if (mMediaPlayer != null) {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
}
mMediaPlayer.release();
mMediaPlayer = null;
}
}
}

更多相关文章

  1. android开发中常用的设计模式汇总
  2. 记一次趣头条 Android(安卓)面试经历!
  3. Android之如何打开USB调试模式
  4. Android(安卓)OTA升级原理 - 实现流程(整理一)
  5. android lint 是什么
  6. Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
  7. android 通过Camera和Surfaceview实现照相 图片预览 保存图片到
  8. Android(安卓)Activity的四种启动模式
  9. Android常用设计模式(二)

随机推荐

  1. 剪切时死机文件丢失了咋恢复
  2. 属性0字节. 不知道如何找回呢
  3. 如何找到笔记本因为剪切时中断,文件不见了
  4. 文件名变乱码. 不知道咋找到呢
  5. 基于AI技术的应用开源管理系统,对接AI有关
  6. PHP表单验证实例DOME分享
  7. 【开源php】 万岳在线教育系统WEB开源版
  8. 磁盘结构损坏 chkdsk无法修复. 不知道怎
  9. tp6 全局异常处理
  10. 各类《常用官方网址》大全