1. 程式人生 > >Andorid 呼叫系統震動

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表示一直震動
                }
            }
        }
    };
}

經過以上操作我們得任務就完成了,不妨可以試一下。這裡寫圖片描述