Android利用传感器实现类似摇一摇功能
1.基本原理
摇一摇功能基本原理是利用手机加速度传感器,当加速度到达某个值时,触发某个事件,如UI改变,手机震动,播放声音,获取数据等事件。
2.传感器原理和使用
传感器原理和使用,可以参见上一篇博客,Android中传感器Sensor的使用
3.声音事件
获取对象MediaPlay类 mediaPlayer=MediaPlayer.create(getApplicationContext(), R.raw.music);
事件触发:mediaPlayer.start();
4.震动事件
获取Vibrator对象,vibrator=(Vibrator) getSystemService(VIBRATOR_SERVICE);
获取权限:<uses-permission android:name="android.permission.VIBRATE"/>
事件触发: vibrator.vibrate(200);
5.代码实现
5.1初始化管理对象SensorManager,Vibrator,MediaPlayer
1 sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE); 2 vibrator=(Vibrator) getSystemService(VIBRATOR_SERVICE); 3 mediaPlayer=MediaPlayer.create(getApplicationContext(), R.raw.music);
R.raw.music是声音素材,raw目录下。
5.2创建传感器事件监听匿名类
1 private SensorEventListener sensorEventListener=new SensorEventListener() { 2 3 @Override 4 public void onSensorChanged(SensorEvent event) { 5 6 7 float[] values=event.values; 8 // 一般在这三个方向的重力加速度达到40就达到了摇晃手机的状态。 9 float x = values[0]; // x轴方向的重力加速度,向右为正 10 float y = values[1]; // y轴方向的重力加速度,向前为正 11 float z = values[2]; // z轴方向的重力加速度,向上为正 12 int medumValue = 10; 13 if(Math.abs(x) > medumValue || Math.abs(y) > medumValue || Math.abs(z) > medumValue) 14 { 15 Log.i("tag", "x="+values[0]+",y="+values[1]+",z="+values[2]); 16 vibrator.vibrate(200); 17 Message msg=new Message(); 18 msg.what=SENSOR_SHAKE; 19 handler.sendMessage(msg); 20 mediaPlayer.start(); 21 } 22 23 } 24 25 @Override 26 public void onAccuracyChanged(Sensor sensor, int accuracy) { 27 // TODO Auto-generated method stub 28 29 } 30 };
5.3Handler处理消息
1 private Handler handler=new Handler(){ 2 @Override 3 public void handleMessage(Message msg) { 4 super.handleMessage(msg); 5 switch (msg.what) { 6 case SENSOR_SHAKE: 7 Toast.makeText(getApplicationContext(), "手机摇晃中", Toast.LENGTH_LONG).show(); 8 9 break; 10 11 default: 12 break; 13 } 14 } 15 };
5.4注册和关闭监听
1 @Override 2 protected void onResume() { 3 super.onResume(); 4 if(sensorManager!=null){ 5 sensorManager.registerListener(sensorEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); 6 7 } 8 } 9 @Override 10 protected void onPause() { 11 super.onPause(); 12 if(sensorManager!=null){ 13 sensorManager.unregisterListener(sensorEventListener); 14 } 15 }
6.示例代码下载
http://pan.baidu.com/s/1bns5bUB
7.运行界面