近期因为工作的原因,写了一个如题的测试例子,本人从事android时间有限,请各位慢点拍砖、、

  主程序如下:

 

package com.kingtone.www.record;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.net.Socket;import android.app.Activity;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.media.MediaRecorder;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;import com.kingtone.www.record.util.EnvironmentShare;/*** * @author YuanLiangFeng 袁良锋** 本类主要实现 录音至SD卡上,并且可以实现录音的播放*/public class Main extends Activity implements OnClickListener {// 多媒体播放器private MediaPlayer mediaPlayer;// 多媒体录制器private MediaRecorder mediaRecorder = new MediaRecorder();// 音频文件private File audioFile;// 传给Socket服务器端的上传和下载标志private final int UP_LOAD = 1;private final int DOWN_LOAD = 2;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);// 获得三个按钮的UI控件Button btnStart = (Button) findViewById(R.id.btnStart);Button btnStop = (Button) findViewById(R.id.btnStop);Button btnPlay = (Button) findViewById(R.id.btnPlay);Button btnUpLoad = (Button) findViewById(R.id.btnUpLoad);Button btnDownLoad = (Button) findViewById(R.id.btnDownLoad);btnStart.setOnClickListener(this);btnStop.setOnClickListener(this);btnPlay.setOnClickListener(this);btnUpLoad.setOnClickListener(this);btnDownLoad.setOnClickListener(this);}@Overridepublic void onClick(View view) {try {String msg = "";switch (view.getId()) {// 开始录音case R.id.btnStart:if (!EnvironmentShare.haveSdCard()) {Toast.makeText(this, "SD不存在,不正常录音!!", Toast.LENGTH_LONG).show();}else{// 设置音频来源(一般为麦克风)mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置音频输出格式(默认的输出格式)mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);// 设置音频编码方式(默认的编码方式)mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);// 创建一个临时的音频输出文件audioFile = File.createTempFile("record_", ".amr",EnvironmentShare.getAudioRecordDir());// 设置录制器的文件保留路径mediaRecorder.setOutputFile(audioFile.getAbsolutePath());// 准备并且开始启动录制器mediaRecorder.prepare();mediaRecorder.start();msg = "正在录音...";}break;// 停止录音 case R.id.btnStop:if (audioFile != null) {mediaRecorder.stop();}msg = "已经停止录音.";break;// 录音文件的播放 case R.id.btnPlay:if (audioFile != null) {mediaPlayer = new MediaPlayer();// 为播放器设置数据文件 mediaPlayer.setDataSource(audioFile.getAbsolutePath());// 准备并且启动播放器mediaPlayer.prepare();mediaPlayer.start();mediaPlayer.setOnCompletionListener(new OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {setTitle("录音播放完毕.");}});msg = "正在播放录音...";}break;// 上传录音文件 case R.id.btnUpLoad:// 开始上传录音文件if (audioFile != null) {msg = "正在上传录音文件...";audioUpLoad();}break;// 下载录音文件 case R.id.btnDownLoad:// 开始下载录音文件msg = "正在下载录音文件...";downLoadDFile();break; }// 更新标题栏 并用 Toast弹出信息提示用户if (!msg.equals("")) {setTitle(msg);Toast.makeText(this, msg, Toast.LENGTH_LONG).show();}} catch (Exception e) {setTitle(e.getMessage());}}/*** 上传 录音文件*/private void audioUpLoad(){new Thread(){public void run() {DataInputStream reader = null;DataOutputStream out = null;Socket socket = null;byte[] buf = null;try {// 连接Socketsocket = new Socket("192.168.42.219",9999);// 1. 读取文件输入流reader = new DataInputStream(new BufferedInputStream(new FileInputStream(audioFile))); // 2. 将文件内容写到Socket的输出流中 out = new DataOutputStream(socket.getOutputStream()); out.writeInt(UP_LOAD);out.writeUTF(audioFile.getName()); //附带文件名 int bufferSize = 2048; //2K buf = new byte[bufferSize]; int read = 0; // 将文件输入流 循环 读入 Socket的输出流中 while((read = reader.read(buf)) != -1){ out.write(buf, 0, read); } handler.sendEmptyMessage(UPLOAD_SUCCESS);} catch (Exception e) {handler.sendEmptyMessage(UPLOAD_FAIL);}finally{try {// 善后处理buf = null;out.close();reader.close();socket.close();} catch (Exception e) {}}};}.start();}/*** 下载录音文件*/private void downLoadDFile(){new Thread(){public void run() {DataOutputStream writer = null;DataOutputStream socketOut = null;DataInputStream inPutStream = null;Socket socket = null;byte[] buf = null;try {// 连接Socketsocket = new Socket("192.168.42.219",9999);// 向服务端发送请求及数据socketOut = new DataOutputStream(socket.getOutputStream());socketOut.writeInt(DOWN_LOAD);socketOut.writeUTF(audioFile.getName());// 1. 读取Socket的输入流 inPutStream = new DataInputStream(socket.getInputStream()); File downLoadFile = new File(EnvironmentShare.getDownAudioRecordDir().getAbsolutePath()+ "/" + audioFile.getName());downLoadFile.createNewFile();// File downLoadFile = File.createTempFile( fileName, ".amr", EnvironmentShare.getDownAudioRecordDir());// 2. 获得文件的输出流writer = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(downLoadFile))); int bufferSize = 2048; //2K buf = new byte[bufferSize]; int read = 0; // 将文件输入流 循环 读入 Socket的输出流中 while((read = inPutStream.read(buf)) != -1){ writer.write(buf, 0, read); } handler.sendEmptyMessage(DOWNLOAD_SUCCESS);} catch (Exception e) {handler.sendEmptyMessage(DOWNLOAD_FAIL);}finally{try {// 善后处理buf = null;inPutStream.close();writer.close();socket.close();} catch (Exception e) {}}};}.start();}// Socket上传下载 结果标志private final int UPLOAD_SUCCESS = 1;private final int UPLOAD_FAIL = 2;private final int DOWNLOAD_SUCCESS = 3;private final int DOWNLOAD_FAIL = 4;// Socket 上传下载 结果 Handler处理类Handler handler = new Handler(){public void handleMessage(android.os.Message msg) {String showMessage = "";switch (msg.what) {case UPLOAD_SUCCESS:showMessage = "录音文件上传成功!";break;case UPLOAD_FAIL:showMessage = "录音文件上传失败!";break;case DOWNLOAD_SUCCESS:showMessage = "录音文件下载成功!";break;case DOWNLOAD_FAIL:showMessage = "录音文件下载失败!";break;default:break;}// 显示提示信息并 设置标题EnvironmentShare.showToastAndTitle(Main.this, showMessage, true);};};}


 

 

 

其中用到的一个辅助类:

 

 

package com.kingtone.www.record.util;import java.io.File;import android.app.Activity;import android.os.Environment;import android.widget.Toast;/*** * @author YuanLiangFeng 袁良锋* at 2011-03-1** 该类为 硬件检测的 公共类*/public class EnvironmentShare {// 存放录音文件夹的名称static String AUDIO_RECORD = "/AudioRecord";// 存放下载而来的录音文件夹名称static String DOWNLOAD_AUDIO_RECORD = "/AudioRecord/downLoad";/*** 检测当前设备SD是否可用* * @return 返回"true"表示可用,否则不可用*/public static boolean haveSdCard(){return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ;}/*** 获得SD卡根目录路径 * * @return String类型 SD卡根目录路径*/public static String getSdCardAbsolutePath(){return Environment.getExternalStorageDirectory().getAbsolutePath();}/*** 获得存储 录音文件的文件夹* * @return File类型 * 存储 录音文件的文件夹*/public static File getAudioRecordDir(){File audioRecordFile = new File(EnvironmentShare.getSdCardAbsolutePath() + AUDIO_RECORD);if (!audioRecordFile.exists()) {// 此处可能会创建失败,暂不考虑audioRecordFile.mkdir();}return audioRecordFile;}/*** 获得存储 下载而来的录音文件的文件夹* * @return File类型 * 存储 下载而来的 录音文件的文件夹*/public static File getDownAudioRecordDir(){File audioRecordFile = new File(EnvironmentShare.getSdCardAbsolutePath() + DOWNLOAD_AUDIO_RECORD);if (!audioRecordFile.exists()) {// 此处可能会创建失败,暂不考虑audioRecordFile.mkdir();}return audioRecordFile;}/*** 用Toast显示指定信息* * @param activity Activity类型 要显示提示信息的页面上下文* @param message String类型 将显示的提示信息内容* @param isLong boolean类型 如果为"true"表示长时间显示,否则为短时间显示*/public static void showToast(Activity activity,String message,boolean isLong){if (message == null ||message.equals("")) return ;int showTime = Toast.LENGTH_SHORT;if (isLong) {showTime = Toast.LENGTH_LONG;}Toast.makeText(activity, message, showTime).show();}/*** 用Toast显示指定信息 并设置标题显示 信息* * @param activity Activity类型 要显示提示信息的页面上下文* @param message String类型 将显示的提示信息内容* @param isLong boolean类型 如果为"true"表示长时间显示,否则为短时间显示*/public static void showToastAndTitle(Activity activity,String message,boolean isLong){activity.setTitle(message);showToast(activity, message, isLong);}}


 

main.xml 配置如下:

<?xml version="1.0" encoding="utf-8"?>


 

AndroidManifest.xml  配置如下:

<?xml version="1.0" encoding="utf-8"?> 


 

 

服务端的代码放到 附件里吧,要不然文章太长了、

 

资源下载地址!            下载地址。。。。

 

 

 

 

更多相关文章

  1. Android(安卓)国际化,文本国际化,图片国际化
  2. mac Android(安卓)studio3.2版本安装+环境搭建
  3. Android利用Http下载文件
  4. Android——新手指引 指定View高光显示自定义控件
  5. Android(安卓)SDK Manager无法更新的解决
  6. Android(安卓)开发环境入门
  7. 关于android 多媒体数据库
  8. 关于android:screenOrientation="portrait"
  9. NPM 和webpack 的基础使用

随机推荐

  1. 手机端首页仿写
  2. Android 网络开发抓包工具Fiddler、tcpdu
  3. Docker_学习笔记系列之网络
  4. Docker_学习笔记系列之数据卷
  5. 【网站模板】第01期—15套免费网站后台管
  6. CI/CD笔记-Jenkins的安装部署
  7. 「CI集成」基于Jest Mock API对业务逻辑
  8. Docker_学习笔记系列之仓库
  9. linux_学习之防火墙firewalld
  10. Docker_学习笔记系列之镜像