检测手机摇动通过实现SensorEventListener接口实现
振动通过Vibrator实现
音效通过SoundPool实现
微信各种音效文件下载:微信音效大全
当然记得振动需要声明权限:public class MainShakeActivity extends BaseActivity implements SensorEventListener { private static final String TAG="MainShakeActivity"; ... //定义sensor管理器 private SensorManager mSensorManager; //震动 private Vibrator mVibrator; /** * 音效 */ SoundPool mSoundPool; /** * 音频id */ int mSoundId; /*存储服务器返回的response*/ MainShakeBean mBean; @Override protected void initData() { super.initData(); //获取传感器管理服务 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); //震动 mVibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE); /*摇一摇音效*/ /*public SoundPool(int maxStream, int StreamType, int srcuality) maxStream —— 同时播放的流的最大数量,即同时能播放音乐的数量上限,具体理解讲看完后文 streamType —— 流的类型,一般都是使用AudioManager.STREAM_MUSIC,表示可以重复播放 srcQuality —— 采样率转化质量,但是现在该功能还不生效,可能以后的Android版本会起作用吧,建意用0*/ mSoundPool= new SoundPool(1, AudioManager.STREAM_SYSTEM, 0); /*int load(Context context, int resId, int priority) 参数Context context:略 参数resId:代表资源文件中的音乐文件,如/res/raw/dingdong.ogg文件 参数int priority:API中指出,该参数目前没有效果,建议设置为1。*/ mSoundId=mSoundPool.load(this,R.raw.shake, 1); //第二个参数是音乐资源文件 } @Override protected void onResume() { super.onResume(); //加速度传感器 //还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等, //根据不同应用,需要的反应速率不同,具体根据实际情况设定 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); /*离开界面解除振动检测*/ mSensorManager.unregisterListener(this); /*离开界面取消网络请求*/ client.getRequestQueue().cancelAll(TAG); /*离开界面释放音频资源*/ mSoundPool.unload(mSoundId); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { //当传感器精度改变时回调该方法,Do nothing. } @Override public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub int sensorType = event.sensor.getType(); //values[0]:X轴,values[1]:Y轴,values[2]:Z轴 float[] values = event.values; if (sensorType == Sensor.TYPE_ACCELEROMETER) { /* *经过测试加速度设置为18的时候摇晃强度比较合理 */ final int ACCELEROMETER=18; if ((Math.abs(values[0]) > ACCELEROMETER || Math.abs(values[1]) > ACCELEROMETER || Math.abs(values[2]) > ACCELEROMETER)) { ToastUtil.showShortToast(MainShakeActivity.this, "正在努力加载"); //摇动手机后,再伴随震动提示~~ mVibrator.vibrate(500); /*播放摇一摇音效*/ mSoundPool.play(mSoundId, 1, 1, 1, 0, 1);//播放声音 /*网络请求数据*/ /*final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop,floatrate) 播放指定音频的音效,并返回一个streamID,如果失败返回0; 参数soundId: 即SoundPool对象load函数的返回值 参数priority:音频的优先级,值越大优先级高,影响当同时播放数量超出了最大支持数时SoundPool对该流的处理; SoundPool类的构造函数SoundPool(int maxStream, int StreamType, int srcuality)中参数maxStream指定了 SoundPool对象能同时播音乐文件的最大数量maxStream,所以当使用SoundPool对象循环调用play播放音乐, 如果调用数量超过了maxStream,则就会根据paly中的priority设置的权限来确定哪些被播放,哪些不会被播放。 参数loop: 循环播放的次数,0为值播放一次,-1为无限循环,其他值为播放loop+1次(例如,3为一共播放次)。 参数rate:播放的速率,范围0.5-2.0(0.5为一半速率,1.0为正常速率,2.0为两倍速率) 参数leftVolume:左声道音量, 值在0.0f到1.0之前 参数rightVolume:左声道音量, 值在0.0f到1.0之前*/ shake(); } } } public void shake() { ... } }
<uses-permission android:name="android.permission.VIBRATE" />