1、音量控制 AudioManager:
获取方式
// 从系统服务中获取音频管理器
mAudioMgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
共有六种响铃类型:通话音,系统音,铃音,媒体音,闹钟音,通知音
{ AudioManager.STREAM_VOICE_CALL, AudioManager.STREAM_SYSTEM,
AudioManager.STREAM_RING, AudioManager.STREAM_MUSIC,
AudioManager.STREAM_ALARM, AudioManager.STREAM_NOTIFICATION};
两个调整音量的函数:
adjustStreamVolume()调整一级音量。
setStreamVolume()调整到某音量值
2、 录制音频部分,媒体录制器MediaRecorder
需要录音录像权限以及SD卡权限
初始化录制
// 初始化录制操作
private void initRecord() {
mMediaRecorder = new MediaRecorder(); // 创建一个媒体录制器
mMediaRecorder.setOnErrorListener(this); // 设置媒体录制器的错误监听器
mMediaRecorder.setOnInfoListener(this); // 设置媒体录制器的信息监听器
mMediaRecorder.setAudioSource(AudioSource.MIC); // 设置音频源为麦克风
mMediaRecorder.setOutputFormat(OutputFormat.AMR_NB); // 设置媒体的输出格式
mMediaRecorder.setAudioEncoder(AudioEncoder.AMR_NB); // 设置媒体的音频编码器,必须在setOutputFormat之后调用,否则会报异常
// mMediaRecorder.setAudioSamplingRate(8); // 设置媒体的音频采样率。可选
// mMediaRecorder.setAudioChannels(2); // 设置媒体的音频声道数。可选
// mMediaRecorder.setAudioEncodingBitRate(1024); // 设置音频每秒录制的字节数。可选
mMediaRecorder.setMaxDuration(10 * 1000); // 设置媒体的最大录制时长
// mMediaRecorder.setMaxFileSize(1024*1024*10); // 设置媒体的最大文件大小
// setMaxFileSize与setMaxDuration设置其一即可
mMediaRecorder.setOutputFile(mRecordFilePath); // 设置媒体文件的保存路径
try {
mMediaRecorder.prepare(); // 媒体录制器准备就绪
mMediaRecorder.start(); // 媒体录制器开始录制
} catch (Exception e) {
e.printStackTrace();
}
}
取消录制
// 取消录制操作
private void cancelRecord() {
if (mMediaRecorder != null) {
mMediaRecorder.setOnErrorListener(null); // 错误监听器置空
mMediaRecorder.setPreviewDisplay(null); // 预览界面置空
try {
mMediaRecorder.stop(); // 媒体录制器停止录制
} catch (Exception e) {
e.printStackTrace();
}
mMediaRecorder.release(); // 媒体录制器释放资源
mMediaRecorder = null;
}
}
定义错误监听器和信息监听器(信息监控器遇到录制状况:例如录制达到限制时长)
// 在录制发生错误时触发
public void onError(MediaRecorder mr, int what, int extra) {
if (mr != null) {
mr.reset(); // 重置媒体录制器
}
}
// 在录制遇到状况时触发
public void onInfo(MediaRecorder mr, int what, int extra) {
// 录制达到最大时长,或者达到文件大小限制,都停止录制
if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED
|| what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED) {
ck_record.setChecked(false);
}
}
3.2、播放音频,媒体播放器MediaPlayer
1、根据路径或者rawid初始化媒体播放器。这里只是传入了路径,播放器的路径指定要调用setDataSourse或create
// 根据SD卡的文件路径,初始化媒体播放器
public void init(String path) {
mAudioPath = path;
ck_play.setEnabled(true);
ck_play.setTextColor(Color.BLACK);
// 创建一个媒体播放器
mMediaPlayer = new MediaPlayer();
// 设置媒体播放器的播放完成监听器
mMediaPlayer.setOnCompletionListener(this);
Log.d(TAG, "audio path = " + mAudioPath);
}
// 根据raw目录的资源编号,初始化媒体播放器
public void initFromRaw(Context context, int raw_id) {
mContext = context;
mRawId = raw_id;
ck_play.setEnabled(true);
ck_play.setTextColor(Color.BLACK);
// 创建一个媒体播放器
mMediaPlayer = new MediaPlayer();
// 设置媒体播放器的播放完成监听器
mMediaPlayer.setOnCompletionListener(this);
}
2、开始播放,这个函数也用来从头播放
// 从头开始播放
private void play() {
try {
mMediaPlayer.reset(); // 重置媒体播放器
// 设置音频流的类型为音乐
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
if (!TextUtils.isEmpty(mAudioPath)) {
// 设置媒体数据的文件路径
mMediaPlayer.setDataSource(mAudioPath);
mMediaPlayer.prepare(); // 媒体播放器准备就绪
} else {
// 设置指定目录路径的音乐文件
//mMediaPlayer = MediaPlayer.create(context, Uri.parse(path));
// 设置指定资源编号的音乐文件
mMediaPlayer = MediaPlayer.create(mContext, mRawId);
// 通过create方法创建的播放器实例,无需再调用prepare方法,因为create内部已经调用过了
}
mMediaPlayer.start(); // 媒体播放器开始播放
// 设置进度条的最大值,也就是媒体的播放时长
pb_play.setMax(mMediaPlayer.getDuration());
mTimer = new Timer(); // 创建一个计时器
// 计时器每隔一秒就更新进度条上的播放进度
mTimer.schedule(new TimerTask() {
@Override
public void run() {
pb_play.setProgress(mMediaPlayer.getCurrentPosition());
}
}, 0, 1000);
} catch (Exception e) {
e.printStackTrace();
}
}
3、设置播放结束的监听器。
// 一旦发现媒体播放完毕,就触发播放完成监听器的onCompletion方法
public void onCompletion(MediaPlayer mp) {
isFinished = true;
pb_play.setProgress(0);
ck_play.setChecked(false);
if (mTimer != null) {
mTimer.cancel(); // 取消计时器
}
}