android 录音的断点续传
系统没有暂停的功能 只能把每次的录音进行拼接。。。
package com.example.zrecord;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Locale;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private MediaRecorder mr;
private String path;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn1 = (Button) findViewById(R.id.button1);
Button btn2 = (Button) findViewById(R.id.button2);
Button btn3 = (Button) findViewById(R.id.button3);
Button btn4 = (Button) findViewById(R.id.button4);
// 录音1
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
setState();
// 准备录制
mr.prepare();
// 开始录制
mr.start();
Toast.makeText(getApplicationContext(), "开始录音...", 0)
.show();
} catch (Exception e) {
e.printStackTrace();
}
}
});
// 录音2
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mr != null) {
mr.stop();
mr.release();
mr = null;
Toast.makeText(getApplicationContext(), "结束录音...", 0)
.show();
}
}
});
// 录音3
btn3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
btn4.setOnClickListener(new OnClickListener() {
private MediaPlayer mPlayer;
@Override
public void onClick(View v) {
mPlayer = new MediaPlayer();
try {
// mPlayer.setDataSource((String) SDCardUtils.getValue(
// getApplicationContext(), "R2", ""));
// mPlayer.prepare();
// mPlayer.start();
// 合并所有的文件并进行播放
File f = SetHeBing();
mPlayer.setDataSource(f.getAbsolutePath());
mPlayer.prepare();
mPlayer.start();
} catch (Exception e) {
}
}
});
}
private void setState() {
// file = new File("/sdcard/"
// + "YY"
// + new DateFormat().format("yyyyMMdd_hhmmss",
// Calendar.getInstance(Locale.CHINA)) + ".amr");
path = SDCardUtils.getSDCardPath()
+ new DateFormat().format("yyyyMMdd_hhmmss",
Calendar.getInstance(Locale.CHINA)) + ".amr";
SDCardUtils.saveValue(this, "R2", path);
// 创建录音对象
mr = new MediaRecorder();
// 从麦克风源进行录音
// mr.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
//
// // 设置输出格式
// mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
//
// mr
// .setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
//
// // 设置编码格式
// mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
// 设置录音为麦克风
mr.setAudioSource(MediaRecorder.AudioSource.MIC);
mr.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
// 设置输出文件
mr.setOutputFile(path);
}
protected File SetHeBing() {
/** 合并所有的音频文件 */
// 创建音频文件,合并的文件放这里
File tempFile = new File(SDCardUtils.getSDCardPath() + "hebing.amr");
FileOutputStream fileOutputStream = null;
// if (!mergeFile.exists()) {
// try {
// mergeFile.createNewFile();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
try {
fileOutputStream = new FileOutputStream(tempFile);
} catch (Exception e) {
e.printStackTrace();
}
// list里面为暂停录音 所产生的几段录音文件的名字,中间几段文件的减去前面的6个字节头文件
ArrayList<String> recordingFiles = new ArrayList<String>();
String path1 = (String) SDCardUtils.getValue(getApplicationContext(),
"R1", "");
String path2 = (String) SDCardUtils.getValue(getApplicationContext(),
"R2", "");
// File f1 = new File(path1);
// File f2 = new File(path2);
recordingFiles.add(path1);
recordingFiles.add(path2);
for (int index = 0; index < recordingFiles.size(); index++) {
File file = new File(recordingFiles.get(index));
try {
FileInputStream fileInputStream = new FileInputStream(file);
byte[] myByte = new byte[fileInputStream.available()];
// 文件长度
int length = myByte.length;
Log.d("RECORD-LENGTH", length + "");
// 头文件
if (index == 0) {
while (fileInputStream.read(myByte) != -1) {
fileOutputStream.write(myByte);
// fileOutputStream.write(myByte, 0,length);
}
}
// 之后的文件,去掉前面6个字节(头文件)
else {
while (fileInputStream.read(myByte) != -1) {
fileOutputStream.write(myByte, 6, length - 6);
}
}
fileOutputStream.flush();
fileInputStream.close();
// 合并之后删除文件
// file.delete();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 结束后关闭流
try {
fileOutputStream.flush();
fileOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return tempFile;// 指向它,以便获取地址
}
}
android 录音的断点续传的更多相关文章
- 通过Android录音进行简单音频分析
Android录音有MediaRecorder和AudioRecord两种方式,前者使用方便,可以直接生成录音文件,但是录音格式为aac和amr等等,都经过压缩处理,不方便进行音频分析. 而用Audi ...
- 【Android】【录音】Android录音--AudioRecord、MediaRecorder
[Android][录音]Android录音--AudioRecord.MediaRecorder Android提供了两个API用于实现录音功能:android.media.AudioRecord. ...
- Android 录音和播放
今天工作上需要做一个一边录音一边播放的功能,大致原因是有一个外部设备输入音频到我们机器,然后我们机器需要马上把音频播放出来.所以了解了一些有关录音和播放的知识.接到这个任务的第一反应就是看看Andro ...
- 关于ios 和 android 录音(语音)对聊文件格式问题
关于ios 和 android 录音(语音)对聊文件格式问题 在做语音对讲的时候,将会碰到录制语音格式的问题,这些需要跨平台我们可能需要使用双方平台都支持的格式,或者执行编码转换 解决方式如下: wa ...
- Android 录音器
Android自带的mediarecoder录音器不含pause暂停功能,解决方法:录制多个音频片段,最后合成一个文件. 参照 : http://blog.csdn.net/a601445984/ar ...
- Android录音应用
首先是xml布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...
- android 多线程下载 断点续传
来源:网易云课堂Android极客班第八次作业练习 练习内容: 多线程 asyncTask handler 多线程下载的原理 首先获取到目标文件的大小,然后在磁盘上申请一块空间用于保存目标文件,接着把 ...
- android录音相关
android的麦克风在现在的生活中发挥着很大的作用,打电话,视频聊天,语音识别等等. android sdk的api里提供了很方便的调用方法,下面写一个小的DEMO. 五个按钮:开始录音,停止,播放 ...
- Android录音--AudioRecord、MediaRecorder
Android提供了两个API用于实现录音功能:android.media.AudioRecord.android.media.MediaRecorder. 网上有很多谈论这两个类的资料.现在大致总结 ...
随机推荐
- openSUSE 国内镜像和镜像使用帮助 (zhuan)
https://my.oschina.net/u/2475751/blog/631036?p={{currentPage-1}} https://lug.ustc.edu.cn/wiki/mirror ...
- 快速认识ELK中的L - Logstash
快速认识ELK中的L - Logstash 原创 2016-12-07 杜亦舒 简介 Logstash 是一个开源的数据采集引擎. Logstash 就像是一个管子,左面接数据源接收数据,右面接存储目 ...
- php 新特性
PHP 5.6 1.可以使用表达式定义常量 https://php.net/manual/zh/migration56.new-features.php 在之前的 PHP 版本中,必须使用静态值来定义 ...
- weblogic 下载安装部署说明
http://blog.csdn.net/gaofuqi/article/details/36870887/ http://jingyan.baidu.com/article/d8072ac45f57 ...
- RESEACH PAPER
个,proquest的username和password赫然在目,别急,再看第4个结 果"HB Thompson Subscription Online Databases", ...
- jmeter 建立一个扩展LDAP测试计划
添加用户 第一步你想做的每一个JMeter测试计划是添加一个线程组元素. 线程组告诉JMeter的用户数量你想模拟,用户应该发送的次数 请求,他们应该发送的请求的数量. 继续添加 线程组 首先选择元素 ...
- 【转】10.4新特性-ArcGIS 10.4矢量切片介绍
原文地址:http://zhihu.esrichina.com.cn/article/567 1.矢量切片简介GIS的底图一直使用金字塔技术进行切图,使用户能够快速访问指定级别的地图或者影像.但是切图 ...
- ubuntu安装SCrapy
依次安装 sudo apt-get install build-essential; sudo apt-get install python-dev; sudo apt-get install lib ...
- Python中一些内建函数及os等模块的用法
len(obj) # 求长度:obj可以是str.list等对象 split(str, num) # str-分割符,默认空格: ...
- python中字符与ascii码转换
ASCII码转字符用chr()函数: 字符转ASCII码用ord()函数: