注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

是缘是情是童真

如果你用笑脸面对 你会看见别人的笑脸

 
 
 

日志

 
 

利用录音AudioRecord实现吹一吹效果  

2012-12-05 17:58:52|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
原理其实就是话筒的监听,需要在AndroidManifest.xml中要加入两个权限 
    <uses-permission android:name="android.permission.RECORD_AUDIO"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
另外模拟器无法测试,只能用真机才有效果 
另外:低于API 14的SDK可能无效,我测试小米android2.3.5似乎无效,三星9300 android4.0有效! 
以下是copy的代码,留在此处以便将来有不时之需。 
Java代码  收藏代码
  1. package com.li;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.Message;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. import android.widget.TextView;  
  11.   
  12. public class BlowActivity extends Activity {  
  13.     static TextView text;  
  14.     Button btn;  
  15.     Button btn1;  
  16.     static int i=0;  
  17.     RecordThread tt=null;  
  18.     /** Called when the activity is first created. */  
  19.     @Override  
  20.     public void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.main);  
  23.         text=(TextView)findViewById(R.id.text);  
  24.         btn=(Button)findViewById(R.id.btn);  
  25.         btn.setOnClickListener(listener);  
  26.     }  
  27.       
  28.     class MyHandler extends Handler{  
  29.           
  30.     }  
  31.       
  32.     OnClickListener listener=new OnClickListener(){  
  33.   
  34.         @Override  
  35.         public void onClick(View v) {  
  36.             // TODO Auto-generated method stub  
  37.                 tt=new RecordThread(r);           //点击按钮,启动线程  
  38.                 tt.start();  
  39.         }  
  40.           
  41.     };  
  42.       
  43.     MyHandler r=new MyHandler(){  
  44.         @Override  
  45.         public void handleMessage(Message msg) {  
  46.             // TODO Auto-generated method stub  
  47.             super.handleMessage(msg);          //接收到message后更新UI,并通过isblow停止线程  
  48.             text.setText("你吹了一下屏幕"+i);  
  49.             Parameter.isblow=false;  
  50.       
  51.         }  
  52.     };  
  53. }  

Java代码  收藏代码
  1. package com.li;  
  2.   
  3. import android.media.AudioFormat;  
  4. import android.media.AudioRecord;  
  5. import android.media.MediaRecorder;  
  6. import android.os.Bundle;  
  7. import android.os.Message;  
  8.   
  9. import com.li.BlowActivity.MyHandler;  
  10.   
  11. public class RecordThread extends Thread {  
  12.     private AudioRecord ar;  
  13.     private int bs = 100;  
  14.     private static int SAMPLE_RATE_IN_HZ = 8000;  
  15.     private Message msg;  
  16.     private int number = 1;  
  17.     private int tal = 1;  
  18.     private MyHandler handler;  
  19.     private long currenttime;  
  20.     private long endtime;  
  21.     private long time = 1;  
  22.   
  23.     // 到达该值之后 触发事件  
  24.     private static int BLOW_ACTIVI = 3000;  
  25.   
  26.     public RecordThread(MyHandler myHandler) {  
  27.         super();  
  28.         bs = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,  
  29.                 AudioFormat.CHANNEL_CONFIGURATION_MONO,  
  30.                 AudioFormat.ENCODING_PCM_16BIT);  
  31.         ar = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ,  
  32.                 AudioFormat.CHANNEL_CONFIGURATION_MONO,  
  33.                 AudioFormat.ENCODING_PCM_16BIT, bs);  
  34.         handler = myHandler;  
  35.     }  
  36.   
  37.     @Override  
  38.     public void run() {  
  39.         try {  
  40.             ar.startRecording();  
  41.             Parameter.isblow = true;  
  42.             // 用于读取的 buffer  
  43.             byte[] buffer = new byte[bs];  
  44.             while (Parameter.isblow) {  
  45.                 number++;  
  46.                 sleep(8);  
  47.                 currenttime = System.currentTimeMillis();  
  48.                 int r = ar.read(buffer, 0, bs) + 1;  
  49.                 int v = 0;  
  50.                 for (int i = 0; i < buffer.length; i++) {  
  51.                     v += (buffer[i] * buffer[i]);  
  52.                 }  
  53.                 int value = Integer.valueOf(v / (int) r);  
  54.                 tal = tal + value;  
  55.                 endtime = System.currentTimeMillis();  
  56.                 time = time + (endtime - currenttime);  
  57.   
  58.                 if (time >= 500 || number > 5) {  
  59.   
  60.                     int total = tal / number;  
  61.                     if (total > BLOW_ACTIVI) {  
  62.                         // 发送消息通知到界面 触发动画  
  63.   
  64.                         // 利用传入的handler 给界面发送通知  
  65.                         BlowActivity.i += 1;  
  66.                         handler.sendEmptyMessage(0); // 改变i的值后,发送一个空message到主线程  
  67.   
  68.                         //  
  69.                         number = 1;  
  70.                         tal = 1;  
  71.                         time = 1;  
  72.                     }  
  73.                 }  
  74.   
  75.             }  
  76.             ar.stop();  
  77.             ar.release();  
  78.             bs = 100;  
  79.   
  80.         } catch (Exception e) {  
  81.             e.printStackTrace();  
  82.         }  
  83.     }  
  84. }  

Java代码  收藏代码
  1. public class Parameter {  
  2.     static boolean isblow;  
  3. }  
  评论这张
 
阅读(478)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018