实现录音,播放,以及Socket的上传和下载。。【处女作】
2011-10-17 10:52
381 查看
近期因为工作的原因,写了一个如题的测试例子,本人从事android时间有限,请各位慢点拍砖、、
主程序如下:
其中用到的一个辅助类:
main.xml 配置如下:
AndroidManifest.xml 配置如下:
服务端的代码放到 附件里吧,要不然文章太长了、
资源下载地址!
下载地址。。。。
主程序如下:
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; @Override public 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); } @Override public 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() { @Override public 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 { // 连接Socket socket = 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 { // 连接Socket socket = 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"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/btnStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="录音"/> <Button android:id="@+id/btnStop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止"/> <Button android:id="@+id/btnPlay" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="播放"/> <Button android:id="@+id/btnUpLoad" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="上传"/> <Button android:id="@+id/btnDownLoad" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下载"/> </LinearLayout>
AndroidManifest.xml 配置如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.kingtone.www.record" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> <activity android:name="com.kingtone.www.record.Main" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> </manifest>
服务端的代码放到 附件里吧,要不然文章太长了、
资源下载地址!
下载地址。。。。
相关文章推荐
- 实现录音AAC格式,并上传到服务器,然后下载播放。(包括服务器端代码)
- iOS 开发与安卓平台共通 实现录音文件的录制,上传,下载,播放
- 使用MediaRecorder和MediaPlayer实现录音和播放功能-以及碰到的问题
- Struts2.0实现的文件上传(单附件和多附件)以及附件下载功能
- 实现 ftp 文件/文件夹的上传下载以及删除
- spring boot实现文件上传下载以及多文件上传
- python实现socket上传下载文件-进度条显示
- C#实现多文件上传,写到文件夹中,获取文件信息以及下载文件和删除文件
- Thinkphp中实现文件上传下载以及去除重复
- libcurl post/get上传下载文件 以及断点下载(操作libcurl 实现断点下载(续点续传))
- HttpClient 4.5版本实现文件上传下载以及常用post、get请求
- spring boot 实现文件上传和下载,以及多文件上传
- python实现socket上传下载文件-进度条显示
- SpringMVC实现页面和java模型的数据交互以及文件上传下载和数据校验
- Struts2.0实现的文件上传(单附件和多附件)以及附件下载功能
- 实现录音时随声音大小变化的UI,以及文件上传功能。
- 嵌入式 在arm平台运行ftpd服务器实现文件下载以及上传以及ftp下载url小结
- Python的Socket知识3:socketserver实现多并发、文件上传下载
- Java中实现FTP文件上传下载 涉及中文路径以及中文文件
- C#实现文件上传以及文件下载