每天醒来,敲醒自己的不是钟声,而是梦想。
本讲内容:播放多媒体文件和录音
一、播放音频
在Android中播放音频文件一般都是使用MediaPlayer类来实现的,下面是一些常用的方法
setDataSource() | 设置要播放的音频文件的位置 |
prepare() | 在开始播放之前调用这个方法完成准备工作 |
start() | 开始或继续播放音频 |
pause() | 暂停播放音频 |
reset() | 将MediaPlayer对象重置到刚刚创建的状态 |
seekTo() | 从指定的位置开始播放音频 |
stop() | 停止播放音频,调用这个方法后的MediaPlayer对象无法再播放音频 |
release() | 释放掉与MediaPlayer对象相关的资源 |
isPlaying() | 判断当前MediaPlayer是否正在播放音频 |
getDuration() | 获取载入的音频文件的时长 |
MediaPlayer使用步骤:首先创建一个MediaPlayer对象,然后调用setDataSource()方法来设置音频文件的路径,再调用prepare()方法使MediaPlayer进入到准备状态,接下来调用start()方法就可以开始播放音频,调用pause()方法就会暂住播放,调用reset()方法就会停止播放。
示例一:播放音频
下面是res/layout/activity_main.xml 布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/play"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Play" />
<Button
android:id="@+id/pause"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Pause" />
<Button
android:id="@+id/stop"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Stop" />
</LinearLayout>
下面是MainActivity.java主界面文件:
public class MainActivity extends Activity implements OnClickListener {
private Button play;
private Button pause;
private Button stop;
private MediaPlayer mediaPlayer = new MediaPlayer();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
play = (Button) findViewById(R.id.play);
pause = (Button) findViewById(R.id.pause);
stop = (Button) findViewById(R.id.stop);
play.setOnClickListener(this);
pause.setOnClickListener(this);
stop.setOnClickListener(this);
initMediaPlayer();
}
// 初始化MediaPlayer
private void initMediaPlayer() {
try {
File file = new File(Environment.getExternalStorageDirectory(),"apple.mp3");
mediaPlayer.setDataSource(file.getPath());//指定音频文件的路径
mediaPlayer.prepare();//让MediaPlayer进入到准备状态
} catch (Exception e) {
e.printStackTrace();
}
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.play:
if(!mediaPlayer.isPlaying()){
mediaPlayer.start();//开始播放
}
break;
case R.id.pause:
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();//暂停播放
}
break;
case R.id.stop:
if(mediaPlayer.isPlaying()){
mediaPlayer.reset();//停止播放
initMediaPlayer();
}
break;
default:
break;
}
}
protected void onDestroy() {
super.onDestroy();
if(mediaPlayer!=null){
mediaPlayer.stop();
mediaPlayer.release();
}
}
}
二、播放视频
在Android中播放视频文件一般都是使用VideoView类来实现的,下面是一些常用的方法
setVideoPath() | 设置要播放的视频文件的位置 |
start() | 开始或继续播放视频 |
pause() | 暂停播放视频 |
resume() | 将视频重头开始播放 |
seekTo() | 从指定的位置开始播放视频 |
isPlaying() | 判断当前MediaPlayer是否正在播放视频 |
getDuration() | 获取载入的视频文件的时长 |
suspend() | 将VideoView所占用的资源释放掉 |
示例二:播放视频
下面是res/layout/activity_main.xml 布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<VideoView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/play"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Play" />
<Button
android:id="@+id/pause"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Pause" />
<Button
android:id="@+id/replay"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Replay" />
</LinearLayout>
</LinearLayout>
下面是MainActivity.java主界面文件:
public class MainActivity extends Activity implements OnClickListener {
private VideoView videoView;
private Button play;
private Button pause;
private Button replay;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
videoView=(VideoView) findViewById(R.id.video_view);
play = (Button) findViewById(R.id.play);
pause=(Button) findViewById(R.id.pause);
replay = (Button) findViewById(R.id.replay);
play.setOnClickListener(this);
pause.setOnClickListener(this);
replay.setOnClickListener(this);
initVideoPath();
}
private void initVideoPath() {
try {
File file = new File(Environment.getExternalStorageDirectory(),"dan.mp4");
videoView.setVideoPath(file.getPath());//指定音频文件的路径
} catch (Exception e) {
e.printStackTrace();
}
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.play:
if(!videoView.isPlaying()){
videoView.start();//开始播放
}
break;
case R.id.pause:
if(videoView.isPlaying()){
videoView.pause();//暂停播放
}
break;
case R.id.replay:
if(videoView.isPlaying()){
videoView.resume();//重新播放
}
break;
default:
break;
}
}
protected void onDestroy() {
super.onDestroy();
if(videoView!=null){
videoView.suspend();
}
}
}
二、MediaRecoder 类 录音的使用
一、使用MediaRecorder录制音频实现步骤:
1、创建MediaRecorder对象
2、通过MediaRecoder对象的setAudioSource()方法设置录音的来源
3、通过MediaRecoder对象的setOutputFormat()设置输出格式
4、通过MediaRecoder对象的setAudioEncoder()、setAudioEncodeingBitRate(int bitRate)、setAudioAudioSamling(int samplingRate)设置所录制的声音的编码格式、编码位率、采样率
5、通过MediaRecorder对象的setOutputFile(String path)方法设置录制的音频文件的保存位置
6、调用MeidaRecorder对象的prepare()做预期准备录制
7、调用MediaRecorder对象的start()开始录制声音
示例三
下面是MainActivity.java主界面文件:
public class MainActivity extends Activity implements OnClickListener {
private Button start;
private Button stop;
private MediaRecorder mediaRecorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
start = (Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.stop);
start.setOnClickListener(this);
stop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.start:
// 先检测下是否含有SDCard
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
Toast.makeText(MainActivity.this, "SD卡不存在,请插入SD卡",
Toast.LENGTH_LONG).show();
return;
}
// 创建音频输出的文件路径
File file = new File("/sdcard/"+ "dan"
+ new DateFormat().format("yyyyMMdd_hhmmss",
Calendar.getInstance(Locale.CHINA))+ ".amr");
Toast.makeText(getApplicationContext(),
"正在录音,录音文件在" + file.getAbsolutePath(), Toast.LENGTH_LONG).show();
// 创建录音对象
mediaRecorder = new MediaRecorder();
// 从麦克风源进行录音
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
// 设置录制的声音输出格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
// 设置声音的编码格式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
// 设置录音的输出(保存)的文件路径
mediaRecorder.setOutputFile(file.getAbsolutePath());
try {
// 创建文件
file.createNewFile();
// 准备录制
mediaRecorder.prepare();
} catch (Exception e) {
// TODO: handle exception
}
// 开始录制
mediaRecorder.start();
start.setText("录音中……");
break;
case R.id.stop:
if (mediaRecorder != null) {
mediaRecorder.stop();
// 释放资源
mediaRecorder.release();
mediaRecorder = null;
start.setText("录音");
Toast.makeText(getApplicationContext(), "录音完毕",Toast.LENGTH_LONG).show();
}
break;
}
}
@Override
protected void onDestroy() {// 更加完美可以写
if (mediaRecorder != null) {
mediaRecorder.stop();
// 释放资源
mediaRecorder.release();
mediaRecorder = null;
start.setText("录音");
Toast.makeText(getApplicationContext(), "录音完毕", Toast.LENGTH_LONG).show();
}
super.onDestroy();
}
}
因为录音和写存储卡都需要权限声明,在AndroidManifest.xml注册:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
录音文件在存储卡的根目录几个以dan开头的amr文件