近期因为工作的原因,写了一个如题的测试例子,本人从事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利用Http下载文件
  2. Android 图像处理(类型转换,比例缩放,倒影,圆角)
  3. android获取各路径下的文件流
  4. Android中String类型进行比较大小
  5. android studio中xml文件代码提示问题
  6. Android下的应用编程——用HTTP协议实现文件上传功能
  7. Android Studio动态自定义编译输出的apk文件名
  8. Android 解压APK文件
  9. Android 文件的保存和读取

随机推荐

  1. Android知识体系总结(全方面覆盖Android知
  2. 【Android】Android中 Paint 字体、粗细
  3. android 获取路径目录方法以及判断目录是
  4. Android编译环境
  5. android 学习笔记1
  6. 系出名门Android(6) - 控件(View)之DateP
  7. 关于Android的prelink(Linux)
  8. TextView英文自动换行解决方法
  9. android时区的初始化
  10. android如何设置全屏模式