Andorid 调用系统震动

  1. 前言:
    项目中有时我们需要调用手机的系统震动功能,最近做的项目中有用到。以下是我所用的方法:
    权限:
 <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表示一直震动
                }
            }
        }
    };
}

经过以上操作我们得任务就完成了,不妨可以试一下。Andorid 调用系统震动_第1张图片

你可能感兴趣的:(Andorid 调用系统震动)