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. 网上有很多谈论这两个类的资料.现在大致总结 ...
随机推荐
- scala集合
优先使用不可变集合.不可变集合适用于大多数情况,让程序易于理解和推断,因为它们是引用透明的( referentially transparent )因此缺省也是线程安全的. 使用可变集合时,明确地引用 ...
- JavaScript 同名方法的处理
在JS中,如果存在同名同参的方法,它会先调用哪一个?先看两个例子: 例1: <html> <head> <title></title> <scri ...
- [转载]findContours函数参数说明及相关函数
原文地址:findContours函数参数说明及相关函数作者:鸳都学童 findContours函数,这个函数的原型为: void findContours(InputOutputArray imag ...
- Python核心编程-描述符
python中,什么描述符.描述符就是实现了"__get__"."__set__"或"__delete__" 方法中至少一个的对象.什么是非 ...
- OpenCV3编程入门笔记(5)重要章节小节及核心函数
- 【转】 简单理解Socket
题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...
- data structure
转载请注明出处: 我所遇见的世界会更美好 我曾经逢人就说总是遇到这样那样错误无法解决,但是这些问题只要静下心来仔细思考根本没有解决不了的问题. 其实明明,超级超级简单,然而被老师讲的天花乱坠, 栈: ...
- require.js学习笔记(内容属于转载总结)
<script data-main="src/app" src="src/lib/require.js"></script> backb ...
- Hibernate-细细道来-01
Dao代码,如何编写? 使用Jdbc技术,原始的jdbc操作, Connection/Statement/ResultSet DbUtils组件, 轻量级的dao的组件: Hibernate技术 [ ...
- java多线程的常用方法(以及注意事项)
/* * 线程的常用方法 * 1.start(); * 2.run(); * 3.sleep(int millsecond); * 4.isAlive(); -->判断线程是否还在运行 * 5. ...