一个简单的上传录音demo(上传的录音安卓、苹果都可以播放)
2016-06-20 16:41
691 查看
在之前的一个需求中,需要上传录音用于H5页面播放,所以研究了一下,在其中碰到的问题:上传的录音可以在安卓手机中播放,但是在苹果手机中不能播放,在经过各种查阅之后,修改音频编码器格式为recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
具体贴上代码:
public class RecorderActivity extends Activity {
private final String TAG = "RecorderActivity";
private Button btnStart;
private Button btnStop;
private Button btnUpload;
private TextView text;
private MediaRecorder recorder;
private boolean isSDCardExit; // 判断SDCard是否存在
private File SDPathDir;
private File tempFile;
private String urlStr = "http://192.168.1.61:8080/recorder/aaa.txt"; //这是上传到服务器的地址
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnStart = (Button) findViewById(R.id.btnStart);
btnStop = (Button) findViewById(R.id.btnStop);
btnUpload = (Button) findViewById(R.id.btnUpload);
text = (TextView) findViewById(R.id.text);
btnStart.setEnabled(true);
btnStop.setEnabled(false);
btnUpload.setEnabled(false);
isSDCardExit = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if(isSDCardExit){
SDPathDir = Environment.getExternalStorageDirectory();
}
buttonListener();
}
/**
* 添加按钮事件
*/
private void buttonListener(){
// 开始录音
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
initRecorder();
startRecorder();
text.setText("正在录音……");
btnStart.setEnabled(false);
btnStop.setEnabled(true);
btnUpload.setEnabled(true);
}
});
// 停止录音
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
stopRecorder();
text.setText("停止录音……");
btnStart.setEnabled(true);
btnStop.setEnabled(false);
btnUpload.setEnabled(true);
}
});
// 上传录音
btnUpload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
text.setText("正在上传……");
btnStart.setEnabled(true);
btnStop.setEnabled(false);
btnUpload.setEnabled(false);
if(upload(tempFile)){
text.setText("上传成功……");
}else{
text.setText("上传失败……");
Toast.makeText(RecorderActivity.this, "上传失败", Toast.LENGTH_SHORT);
}
}
});
}
/**
* 准备录音
*/
private void initRecorder(){
recorder = new MediaRecorder();
/* 设置音频源*/
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
/* 设置输出格式*/
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
/* 设置音频编码器,注意这里,设置成AAC,不然苹果手机播放不了*/
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
try {
/* 创建一个临时文件,用来存放录音*/
tempFile = File.createTempFile("tempFile", ".WAV", SDPathDir);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/* 设置录音文件*/
recorder.setOutputFile(tempFile.getAbsolutePath());
}
/**
* 开始录音
*/
private void startRecorder(){
try {
if(!isSDCardExit){
Toast.makeText(this, "请插入SD卡", Toast.LENGTH_LONG).show();
return;
}
recorder.prepare();
recorder.start();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 停止录音
*/
private void stopRecorder(){
if(recorder != null){
recorder.stop();
recorder.release();// 释放资源
recorder = null;
}
}
/**
* 上传文件
* @param file 需要上传的文件
* @return 上传是否成功
*/
private boolean upload(File file){
try {
String end = "\r\n";
String hyphens = "--";
String boundary = "*****";
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
/* 允许使用输入流,输出流,不允许使用缓存*/
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
/* 请求方式*/
conn.setRequestMethod("POST");
conn.setRequestProperty("Charset", "UTF-8");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
/* 当文件不为空,把文件包装并且上传*/
Log.e(TAG, file.toString());
if(file != null){
DataOutputStream ds = new DataOutputStream(conn.getOutputStream());
/* name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件
* filename是文件的名字,包含后缀名的 比如:abc.png*/
ds.writeBytes(hyphens + boundary + end);
ds.writeBytes("Content-Disposition: form-data; " + "name=\"video\";filename=\"" +
file.getName() +"\"" + end);
ds.writeBytes(end);
InputStream input = new FileInputStream(file);
int size = 1024;
byte[] buffer = new byte[size];
int length =
a04c
-1;
/* 从文件读取数据至缓冲区*/
while((length = input.read(buffer)) != -1){
ds.write(buffer, 0, length);
}
input.close();
ds.writeBytes(end);
ds.writeBytes(hyphens + boundary + hyphens + end);
ds.flush();
/* 获取响应码*/
Log.e(TAG, conn.getResponseCode() + "=======");
if(conn.getResponseCode() == 200){
return true;
}
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
if(recorder != null){
recorder.stop();
recorder.release();// 释放资源
recorder = null;
}
super.onStop();
}
}
具体贴上代码:
public class RecorderActivity extends Activity {
private final String TAG = "RecorderActivity";
private Button btnStart;
private Button btnStop;
private Button btnUpload;
private TextView text;
private MediaRecorder recorder;
private boolean isSDCardExit; // 判断SDCard是否存在
private File SDPathDir;
private File tempFile;
private String urlStr = "http://192.168.1.61:8080/recorder/aaa.txt"; //这是上传到服务器的地址
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnStart = (Button) findViewById(R.id.btnStart);
btnStop = (Button) findViewById(R.id.btnStop);
btnUpload = (Button) findViewById(R.id.btnUpload);
text = (TextView) findViewById(R.id.text);
btnStart.setEnabled(true);
btnStop.setEnabled(false);
btnUpload.setEnabled(false);
isSDCardExit = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if(isSDCardExit){
SDPathDir = Environment.getExternalStorageDirectory();
}
buttonListener();
}
/**
* 添加按钮事件
*/
private void buttonListener(){
// 开始录音
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
initRecorder();
startRecorder();
text.setText("正在录音……");
btnStart.setEnabled(false);
btnStop.setEnabled(true);
btnUpload.setEnabled(true);
}
});
// 停止录音
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
stopRecorder();
text.setText("停止录音……");
btnStart.setEnabled(true);
btnStop.setEnabled(false);
btnUpload.setEnabled(true);
}
});
// 上传录音
btnUpload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
text.setText("正在上传……");
btnStart.setEnabled(true);
btnStop.setEnabled(false);
btnUpload.setEnabled(false);
if(upload(tempFile)){
text.setText("上传成功……");
}else{
text.setText("上传失败……");
Toast.makeText(RecorderActivity.this, "上传失败", Toast.LENGTH_SHORT);
}
}
});
}
/**
* 准备录音
*/
private void initRecorder(){
recorder = new MediaRecorder();
/* 设置音频源*/
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
/* 设置输出格式*/
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
/* 设置音频编码器,注意这里,设置成AAC,不然苹果手机播放不了*/
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
try {
/* 创建一个临时文件,用来存放录音*/
tempFile = File.createTempFile("tempFile", ".WAV", SDPathDir);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/* 设置录音文件*/
recorder.setOutputFile(tempFile.getAbsolutePath());
}
/**
* 开始录音
*/
private void startRecorder(){
try {
if(!isSDCardExit){
Toast.makeText(this, "请插入SD卡", Toast.LENGTH_LONG).show();
return;
}
recorder.prepare();
recorder.start();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 停止录音
*/
private void stopRecorder(){
if(recorder != null){
recorder.stop();
recorder.release();// 释放资源
recorder = null;
}
}
/**
* 上传文件
* @param file 需要上传的文件
* @return 上传是否成功
*/
private boolean upload(File file){
try {
String end = "\r\n";
String hyphens = "--";
String boundary = "*****";
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
/* 允许使用输入流,输出流,不允许使用缓存*/
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
/* 请求方式*/
conn.setRequestMethod("POST");
conn.setRequestProperty("Charset", "UTF-8");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
/* 当文件不为空,把文件包装并且上传*/
Log.e(TAG, file.toString());
if(file != null){
DataOutputStream ds = new DataOutputStream(conn.getOutputStream());
/* name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件
* filename是文件的名字,包含后缀名的 比如:abc.png*/
ds.writeBytes(hyphens + boundary + end);
ds.writeBytes("Content-Disposition: form-data; " + "name=\"video\";filename=\"" +
file.getName() +"\"" + end);
ds.writeBytes(end);
InputStream input = new FileInputStream(file);
int size = 1024;
byte[] buffer = new byte[size];
int length =
a04c
-1;
/* 从文件读取数据至缓冲区*/
while((length = input.read(buffer)) != -1){
ds.write(buffer, 0, length);
}
input.close();
ds.writeBytes(end);
ds.writeBytes(hyphens + boundary + hyphens + end);
ds.flush();
/* 获取响应码*/
Log.e(TAG, conn.getResponseCode() + "=======");
if(conn.getResponseCode() == 200){
return true;
}
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
if(recorder != null){
recorder.stop();
recorder.release();// 释放资源
recorder = null;
}
super.onStop();
}
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories