Android录音和播放录音

知识点:自定义控件,MediaPlayer,MediaRecorder



初始化

File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/测试.mp3");
FileName = file.getAbsolutePath();
mStopPlay.setText(FileName);

录音代码

//开始录制音频
private void start() {
recordingTime = 0;
handler.post(runnable);
mRecorder = new MediaRecorder();
// 设置音频录入源
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置记录的媒体文件的输出转换格式。
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 设置音频记录的编码格式。
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//设置音频记录的音频源。
mRecorder.setOutputFile(FileName);
try {
mRecorder.prepare();
} catch (IOException e) {
// Log.e(LOG_TAG, "prepare() failed");
}
mRecorder.start();
isRecording = true;
mRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {
@Override
public void onError(MediaRecorder mr, int what, int extra) {
// 发生错误,停止录制
mRecorder.stop();
mRecorder.release();
mRecorder = null;
isRecording = false;
showToast("录制出错");
}
});
}
//停止录制音频
private void stop() {
if(mRecorder!=null){
mRecorder.stop();
mRecorder.release();
mRecorder = null;
isRecording = false;
}
}

播放录音代码

//stop播放音频
private void stopPlay() {
isPlaying = false;
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
}
//播放音频
private void starPplay() {
isPlaying = true;
playTime = 0;
handler.post(runnable);
mPlayer = new MediaPlayer();
// mStopPlay.setText(mPlayer.getCurrentPosition() + "");
try {
mPlayer.setDataSource(FileName);
mPlayer.prepare();
mPlayer.start();
} catch (IOException e) {
Log.e(LOG_TAG, "播放失败");
}
allPlayTime = mPlayer.getDuration() / 1000;
}

退出时候销毁

@Override
protected void onDestroy() {
if (isRecording) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
super.onDestroy();
}

自定义音频条状图

public class RectAnimationView extends View {
private Paint rectP;
private Paint rectK;
private int rectW = 20;//每个矩形的宽度
private int count = 0;//矩形的个数
private int viewW;//组件的宽度
private int viewH;//组件的高度
private LinearGradient linearGradient;//线性渐变
public RectAnimationView(Context context) {
super(context);
init();
}
public RectAnimationView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public RectAnimationView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
rectP = new Paint();//初始化矩形的画笔
rectP.setColor(Color.parseColor("#00AAFE"));
rectP.setAntiAlias(true);
rectP.setStyle(Paint.Style.FILL);
rectK = new Paint();//初始化边框的画笔
rectK.setAntiAlias(true);
rectK.setStyle(Paint.Style.STROKE);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int modeW = MeasureSpec.getMode(widthMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int modeH = MeasureSpec.getMode(heightMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
if (modeW == MeasureSpec.UNSPECIFIED) {
width = 250;
}
if (modeH == MeasureSpec.UNSPECIFIED) {
height = 250;
}//当宽高不指定的时候,指定默认值
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//计算组件绘制区域的宽高
viewH = getHeight() - getPaddingLeft() - getPaddingRight();
viewW = getWidth() - getPaddingTop() - getPaddingBottom();
int bottom = viewH;//计算view底部距离
count = viewW / (rectW + 10);//计算矩形的个数 10位矩形的间距
// Rect rectw = new Rect(0, 0, viewW, bottom);//外边框矩形
// canvas.drawRect(rectw, rectK);
//循环绘制矩形
for (int i = 0; i < count; i++) {
// 创建LinearGradient并设置渐变颜色数组
// 第一个,第二个参数表示渐变起点 可以设置起点终点在对角等任意位置
// 第三个,第四个参数表示渐变终点
// 第五个参数表示渐变颜色
// 第六个参数可以为空,表示坐标,值为0-1 new float[] {0.25f, 0.5f, 0.75f, 1 }
// 如果这是空的,颜色均匀分布,沿梯度线。
// 第七个表示平铺方式
// CLAMP重复最后一个颜色至最后
// MIRROR重复着色的图像水平或垂直方向已镜像方式填充会有翻转效果
// REPEAT重复着色的图像水平或垂直方向
linearGradient = new LinearGradient(
0,
0,
rectW,
randomH(),
new int[]{Color.BLUE, Color.YELLOW, Color.CYAN, Color.GREEN},
new float[]{0.3f, 0.5f, 0.7f, 0.1f},
Shader.TileMode.CLAMP);
rectP.setShader(linearGradient);
Rect rect = new Rect(
(int) (viewW 0.03f + i (rectW + 10)),
bottom - randomH(),
(int) (viewW 0.03f + (i) (rectW + 10) + rectW),
bottom);
canvas.drawRect(rect, rectP);
}
canvas.save();
postInvalidateDelayed(600);
}
//随机生成矩形的高度,形成梯度
private int randomH() {
double rand = Math.random();
return (int) (rand * viewH);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值