zoukankan      html  css  js  c++  java
  • 网络对讲机C#服务器 Android客户端(三) android客户端代码分析 附加

    完整的工程下载地址(源码):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()
    		{
    			
    			@Override
    			public 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 stub
    				extAudioRecorder = 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()
    		{
    
    		
    			@Override
    			public 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()
    			{
    
    				@Override
    				public void onCompletion(MediaPlayer arg0) {
    					// TODO Auto-generated method stub
    					mediaPlayer.release();
    				}
    				
    			});
    		} catch (IllegalArgumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalStateException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}	
    	}
    	
    	
    	public void onStop()
    	{
    		mediaPlayer.stop();
    		mediaPlayer.release();
    		mediaPlayer=null;
    	}
    }
    


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

    btnPlay.setOnClickListener(new Button.OnClickListener()
    		{
    
    			@Override
    			public void onClick(View arg0) {
    				
    				Log.i(Tag, "Play   "+playSendPath);
    				if(playSendPath!=null)
    				{
    					mPlay.onPlay(playSendPath);
    					tvRecvCount.setText("");
    				}
    				else
    					Toast.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");
    			@Override
    			public void onClick(View arg0) {
    				// TODO Auto-generated method stub
    				if(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
    

  • 相关阅读:
    内容敏感图像压缩
    线性筛素数
    一元三次方程
    holiday
    电话网络
    expect之初使用
    python基本数据类型
    Linux系统中的日志管理
    Linux计划任务(at,crontab)
    RHEL7 启动配置 加密
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3050572.html
Copyright © 2011-2022 走看看