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. 网上有很多谈论这两个类的资料.现在大致总结 ...
随机推荐
- 转:如何学习SQL(第四部分:DBMS扩展功能与SQL高级话题)
转自:http://blog.163.com/mig3719@126/blog/static/285720652010950102575/ 9. DBMS提供的扩展功能 掌握了基本的关系模型原理和DB ...
- 有关使用Maven常见问题总结(Eclipse中使用Maven、Maven项目部署到tomcat等问题)
http://blog.csdn.net/sunitjy/article/details/42709311 ********************************************** ...
- foundation系列
1如何将布尔值转为OC对象? 1把 BOOL 值包装到 NSNumber中: NSNumber *boolNumber = [NSNumber numberWithBool:YES] 2获取BOO ...
- Hbase之进行批处理操作
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; impo ...
- 【bug】“Mat map” opencv全局变量不明确
Mat map= Mat::zeros(WIN_WIDTH, WIN_HIGH, CV_8UC3);//全局变量 int main() { map.setTo(); } Error map 不明确 s ...
- SQL实现数组的功能
今天在工作遇到了一个问题,需要往表中添加数量不小而且没有规律的的数据.思考后我想到了使用高级语言中的数组功能解决. 由于SQL Server并没有数组类型,ANSI SQL-92标准中并没有任何有关数 ...
- iconv 文件编码相互转换
iconv 文件编码相互转换 示例: iconv -f utf-8 -t gbk ~/a.txt > ~/b.txt -f 从哪种格式转换 -t 要转换到哪种格式 a.txt要转换的文件 b.t ...
- 十问 Linux 虚拟内存管理 (glibc) (二)
版权声明:本文由陈福荣原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/184 来源:腾云阁 https://www.qclo ...
- 用NAN简化Google V8 JS引擎的扩展
通过C++扩展Google V8 JS引擎的文章很多,Google V8 JS带的例子也容易明白.但是大部分文章都是Hello World型的,真正使用时发现处处是坑.扩展V8最经典的例子就是node ...
- English substitute
英语写作中替换掉用到发腻的↓常用词↓,吐血整理2小时~~ 动词替换: 1.Improve 提高: Promote: 促进AC之间的贸易 promote the trade between ...