传感器应用的demo自动录音器

来源:互联网 发布:mac双系统切换快捷键 编辑:程序博客网 时间:2024/04/30 05:40

下面我通过一个实例来学会如何使用某一个类型的传感器。我们这里使用加速度传感器来实现这样一个功能:开启我们的录音程序放在你的口袋或者提包里,需要录音的时候把衣服整理一下,或者把提包挪动个位置,那么此时手机就会感受到变化从而开始录音。由此达到神不知鬼不觉的录音效果。说起来似乎有点神,其实做起来很简单。

activity类

public class MainActivity extends ActionBarActivity {private TextView tx1;//录音和停止按钮       private Button recordButton;       private Button stopButton;       //检测摇动相关变量       private long initTime = 0;       private long lastTime = 0;       private long curTime = 0;       private long duration = 0;       private float last_x = 0.0f;       private float last_y = 0.0f;       private float last_z = 0.0f;           private float shake = 0.0f;       private float totalShake = 0.0f;       //是否正在录音       private boolean isRecoding = false;     @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// UI组件           recordButton = (Button) findViewById(R.id.b01);        stopButton = (Button) findViewById(R.id.b02);           tx1 = (TextView)findViewById(R.id.text1);           // 录音按钮点击事件           recordButton.setOnClickListener(new View.OnClickListener() {                   @Override                  public void onClick(View v) {                           //如果没有在录音,那么点击按钮可以开始录音                           if(!isRecoding){                                   startRecord();                           }                   }           });           // 停止按钮点击事件           stopButton.setOnClickListener(new View.OnClickListener() {                   @Override                  public void onClick(View v) {                           initShake();                           //如果正在录音,那么可以停止录音                           Toast.makeText(getApplicationContext(), "录音完毕", Toast.LENGTH_LONG).show();                           isRecoding = false;                   }           });           // 获取传感器管理器           SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);           // 获取加速度传感器           Sensor acceleromererSensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);           // 定义传感器事件监听器           SensorEventListener acceleromererListener = new SensorEventListener() {                   @Override                  public void onAccuracyChanged(Sensor sensor, int accuracy) {                           //什么也不干                   }                   //传感器数据变动事件                   @Override                  public void onSensorChanged(SensorEvent event) {                                   //如果没有开始录音的话可以监听是否有摇动事件,如果有摇动事件可以开始录音                           if(!isRecoding){                                   //获取加速度传感器的三个参数                                   float x = event.values[SensorManager.DATA_X];                                   float y = event.values[SensorManager.DATA_Y];                                   float z = event.values[SensorManager.DATA_Z];                                   //获取当前时刻的毫秒数                                   curTime = System.currentTimeMillis();                                   //100毫秒检测一次                                   if ((curTime - lastTime) > 100) {                                           duration = (curTime - lastTime);                                           // 看是不是刚开始晃动                                           if (last_x == 0.0f && last_y == 0.0f && last_z == 0.0f) {                                                   //last_x、last_y、last_z同时为0时,表示刚刚开始记录                                                   initTime = System.currentTimeMillis();                                           } else {                                                   // 单次晃动幅度                                                   shake = (Math.abs(x - last_x) + Math.abs(y - last_y) + Math.abs(z - last_z)) / duration * 100;                                           }                                           //把每次的晃动幅度相加,得到总体晃动幅度                                           totalShake += shake;                                           // 判断是否为摇动,这是我自己写的标准,不准确,只是用来做教学示例,别误会了^_^                                           if (totalShake > 10 && totalShake / (curTime - initTime) * 1000 > 10) {                                                   startRecord();                                                   initShake();                                           }                                           tx1.setText("总体晃动幅度="+totalShake+ "\n平均晃动幅度="+totalShake / (curTime - initTime) * 1000 );                                   }                                   last_x = x;                                   last_y = y;                                   last_z = z;                                   lastTime = curTime;                           }                   }           };           //在传感器管理器中注册监听器           sm.registerListener(acceleromererListener, acceleromererSensor, SensorManager.SENSOR_DELAY_NORMAL);   }   // 开始录音   public void startRecord() {           //把正在录音的标志设为真           isRecoding = true;           //存放文件           File file = new File("/sdcard/" + "YY"                          + new DateFormat().                        format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".amr");           Toast.makeText(getApplicationContext(), "正在录音,录音文件在" + file.getAbsolutePath(), Toast.LENGTH_LONG).show();        recordButton.setText("录音中……");   }   //摇动初始化   public void initShake() {           lastTime = 0;           duration = 0;           curTime = 0;           initTime = 0;           last_x = 0.0f;           last_y = 0.0f;           last_z = 0.0f;           shake = 0.0f;           totalShake = 0.0f;   }   }

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.example.sensordemo.MainActivity" >    <Button        android:id="@+id/b01"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentTop="true"        android:layout_centerHorizontal="true"        android:layout_marginTop="134dp"        android:text="录音" />    <Button        android:id="@+id/b02"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignRight="@+id/b01"        android:layout_below="@+id/b01"        android:layout_marginTop="32dp"        android:text="停止" />    <TextView        android:id="@+id/text1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_below="@+id/b02"        android:layout_marginLeft="16dp"        android:layout_marginTop="20dp"        android:text="传感器" /></RelativeLayout>

效果图:

-------------------------------------------------转载请注明出处。。





1 0