完整的工程下载地址(源码):http://download.csdn.net/detail/zhujinghao09/5313666

录音功能的实现,开始的时候使用android系统自带录音类,但他的编码方式,pc的windowsmediaPlayer 不识别无法播放,所以从网上找一个无压缩的录音类,录音文件格式和windows 一样.

这个录音类宅这里就不贴出来了,有兴趣可以eoe论坛上找一找,也可以下载我的工程源码,里面有

在这简单的使用其实现无压缩录音文件生成:

/** * 录制wav格式文件 * @param path : 文件路径 */public static File recordChat(ExtAudioRecorder extAudioRecorder,String savePath,String fileName) {File dir = new File(savePath);//如果该目录没有存在,则新建目录if(dir.list() == null){dir.mkdirs();}//获取录音文件File file=new File(savePath+fileName);//设置输出文件extAudioRecorder.setOutputFile(savePath+fileName);extAudioRecorder.prepare();//开始录音extAudioRecorder.start();return file;}/** * 停止录音 * @param mediaRecorder 待停止的录音机 * @return 返回 */public static void stopRecord(final ExtAudioRecorder extAudioRecorder){extAudioRecorder.stop();extAudioRecorder.release();}

//录音按钮

btnRecod.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View arg0) {int h = new Date().getHours();int m = new Date().getMinutes();int s = new Date().getSeconds();String strTime = String.valueOf(h)+"-"+String.valueOf(m)+"-"+String.valueOf(s);//获得系统时间命名文件String savePath="sdcard/MyVoice/";String fileName="ExtAudio"+strTime+".wav";// TODO Auto-generated method stubextAudioRecorder = ExtAudioRecorder.getInstanse(false); //未压缩的录音(WAV)recordChat(extAudioRecorder,savePath,fileName);//mRecorder.onStart("er"+strTime);  //  lastRecordPath="sdcard/MyVoice/"+"er"+strTime+".amr";lastRecordPath=savePath+fileName;           //全局变量}});


停止录音按钮

btnStop.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub//mRecorder.onStop();stopRecord(extAudioRecorder);vPathArrayList.add(lastRecordPath);UpdateVoiceListView(vPathArrayList);             //把录音文件路径添加到声音列表 }});

播放功能是采用android 系统自带的mediaPlayer

播放类:

package er.fly;import java.io.IOException;import android.media.MediaPlayer;public class MyMediaPlay {MediaPlayer mediaPlayer ;public void onPlay(String namePath){mediaPlayer = new MediaPlayer();if(mediaPlayer.isPlaying()){mediaPlayer.reset();}try {mediaPlayer.setDataSource(namePath);mediaPlayer.prepare();mediaPlayer.start();mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){@Overridepublic void onCompletion(MediaPlayer arg0) {// TODO Auto-generated method stubmediaPlayer.release();}});} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void onStop(){mediaPlayer.stop();mediaPlayer.release();mediaPlayer=null;}}


播放和发送的文件路径都是从声音列表中读取的

btnPlay.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View arg0) {Log.i(Tag, "Play   "+playSendPath);if(playSendPath!=null){mPlay.onPlay(playSendPath);tvRecvCount.setText("");}elseToast.makeText(MainActivity.this, "请选择要播放的声音!!", Toast.LENGTH_LONG).show();playSendPath=null;}});btnSend.setOnClickListener(new Button.OnClickListener(){String Path=null;File file;// = new File("sdcard/MyRecvVoice/androidrecv.mp3");@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubif(playSendPath!=null){file=new File(playSendPath);}else{Toast.makeText(MainActivity.this, "请选择要发送的声音!!", Toast.LENGTH_LONG).show();return;}playSendPath=null;UpFile upFile = new UpFile(client);upFile.SetFile(file);upFile.start();}});


其中

playSendPath 是全局变量通过选择列表控件中元组来百变它的值
public void UpdateVoiceListView(ArrayList<String> al)    {    String[]str =new String[al.size()];    for(int i=0;i<al.size();i++)    {    str[i]=al.get(i);    }    ArrayAdapter<String> aad= new ArrayAdapter<String>(this, android.R.layout.simple_list_item_checked, str);    setListAdapter(aad);    }    public void onListItemClick(ListView parent, View v,         int position, long id) {            CheckedTextView item = (CheckedTextView) v;            String path=vPathArrayList.get(position);            Log.i(Tag, path);            playSendPath=path;        }

   

   
最后 就是主线程处理来自子线程的消息类: 主要功能是更新主界面控件状态

package er.fly.nettandclient;import java.util.ArrayList;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.util.Log;import android.widget.TextView;public class MyHandler extends Handler {TextView tvRecvCount;String Tag ="MyHandler";//ArrayList<String> voiceAList;public MyHandler(Looper looper){        super (looper);} public void SetHandlerArgs(TextView tv) { tvRecvCount = tv; } @Override public void handleMessage(Message msg) { // 处理消息 MainActivity ma = new MainActivity(); String path; String Dflag="DownloadFile:"; String strMsg=msg.obj.toString(); Log.i(Tag, strMsg); if(strMsg.indexOf(Dflag)==0) { int index1 = strMsg.indexOf("#"); int index2 = strMsg.indexOf("$"); if(index1>0) { path = strMsg.substring(Dflag.length(),index1); Log.i(Tag, path); MainActivity.vPathArrayList.add(path); Log.i(Tag, strMsg.substring(index1+1)); tvRecvCount.setText(strMsg.substring(index1+1)); } if(index2>0) { Log.i(Tag, strMsg.substring(index2+1)); tvRecvCount.setText(strMsg.substring(index1+1)); }  } }        }
到此,整个项目的基本功能已经可以实现了,有兴趣的朋友可以参照一下。

完整的工程下载地址(源码):http://download.csdn.net/detail/zhujinghao09/5313666

更多相关文章

  1. Android文件系统的提取方法(一)
  2. Android发送邮件附带文件
  3. android的文件系统结构及其引导过程的初步理解
  4. Android中的文件权限操作
  5. Android Studio如何生成APK文件
  6. android确定kernel使用的config文件

随机推荐

  1. Android(安卓)文件的上传
  2. Android计算器布局
  3. Android(安卓)shell 创建 模拟器
  4. Android系统定制之bootanimation.zip的制
  5. Android硬件加速
  6. android之socket网络编程
  7. 【Android(安卓)Studio】Android(安卓)St
  8. Android(安卓)O指纹识别解析
  9. android反编译工具(ApkDec-Release-0.1)-正
  10. Android(安卓)监听软键盘弹起和收起事件