版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Bu_siliang/article/details/80523150
- 前言:
项目中有时我们需要调用手机的系统震动功能,最近做的项目中有用到。以下是我所用的方法:
权限:
<uses-permission android:name="android.permission.VIBRATE" />
/**
* 初始化震动
*
* @param context
*/
public static void initViarbtor(Context context) {
if (context == null) return;
vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
context.getApplicationContext().registerReceiver(mIntentReceiver, filter);
vibrator.vibrate(new long[]{300, 100, 100, 1000}, 0); //等待3s,震动0.1s,等待0.1s,震动 1S;0表示一直震动
}
初始化震动后,我们还有写一个方法用来停止震动:
/**
*停止震动
*
* @param context
*/
public static void stopViarbtor(Context context) {
if (vibrator!=null)
vibrator.cancel();
vibrator=null;
}
到此我们简单的调用系统的震动跟停止震动就已经结束了,但有些产品思想跟人的思想就是不一样,有的黑屏之后,或者按下电源键,震动依然还在。如过只是用以上方法这个需要是满足不了,原因:
安卓是起服务实现震动的,如下:
mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
持续震动可以通过public abstract void vibrate(long[] pattern, int repeat);设置repeat参数来实现
repeat为-1表示不重复, 如果不是-1, 比如改成1, 表示从前面这个long数组的下标为1的元素开始重复.
mVibrator.vibrate(new long[]{100,100,100,1000}, 0);//持续震动
熄屏后发现震动停止了,原因是VibratorService.java中注册了一个屏保事件的广播接收者,进入ACTION_SCREEN_OFF屏保时,会调用doCancelVibrateLocked,继而调用doVibratorOff停掉振动**
所以在我们自己的模块。需要动态建立一个类似的广播进行处理,以确保持续震动还是停止。为此我们还要有一下操作:
static BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
synchronized (vibrator)
{
vibrator.cancel();
Log.e("MelodyTest", "hongyan:has no vibrator");
vibrator.vibrate(new long[]{300, 100, 100, 1000}, 0); //等待3s,震动0.1s,等待0.1s,震动 1S;0表示一直震动
}
}
}
};
}
经过以上操作我们得任务就完成了,不妨可以试一下。