Android適用於IM通知音頻的Vibrator

這個帖子代碼主要源於:
https://github.com/xiaofei-dev/Vibrator
再此基礎上進行稍微修改,代碼如下:
使用方式如下:

private VibratorUtil vibratorUtil;
  /**
     * 初始化震動
     */
    private void initVibratorUtil(){
        vibratorUtil = new VibratorUtil((Vibrator)getSystemService(Service.VIBRATOR_SERVICE));
    }
	
	private void startVibrator(){
	        vibratorUtil.setVibratePattern(1000);
		vibratorUtil.vibrate(VibratorUtil.Companion.getINTERRUPT());
	}

	/** 停止震動 */
	private void stop(){
		vibratorUtil.stopVibrate();
	}

源碼如下:

//此類用於描述振動屬性,即Vibrator類的方法參數值
class VibratorUtil(private val mVibrator: Vibrator) {
    companion object {
        private val TAG = "VibratorUtil"
        //振動模式爲斷續
        val INTERRUPT = 0
        //振動模式爲持續
        val KEEP = 1
        var mPattern = longArrayOf(0, 0, 0)
    }

    //通過設置一個小時時長來模擬持續不停地震動
    private var mDuration = (1000 * 60 * 60).toLong()
    private val mPatternKeep = longArrayOf(1, (1000 * 10).toLong(), 1, (1000 * 10).toLong())
    var isVibrate: Boolean = false
        private set

    private val mAudioAttributes = AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
            .setUsage(AudioAttributes.USAGE_ALARM) //key
            .build()

    fun setDuration(duration: Long) {
        mDuration = duration
    }

    //開始震動
    fun vibrate(mode: Int) {
        Log.d(TAG, "vibrate:0 ")
        isVibrate = true
        when (mode) {
            INTERRUPT -> {
                if (Build.VERSION.SDK_INT >= 21){
                    //適配在高版本系統上無法後臺震動的問題
                    mVibrator.vibrate(mPattern, -1, mAudioAttributes)
                }else{
                    mVibrator.vibrate(mPattern, -1)
                }
                Log.d(TAG, "vibrate:0 ")
            }
            KEEP ->
                if (Build.VERSION.SDK_INT >= 21){
                    //適配在高版本系統上無法後臺震動的問題
                    mVibrator.vibrate(mPatternKeep, -1, mAudioAttributes)
                }else{
                    mVibrator.vibrate(mPatternKeep, -1)//-1是不循環,如果是0則從0開始
                }
            else -> {
            }
        }
    }

    fun stopVibrate() {
        isVibrate = false
        mVibrator.cancel()
    }

    public fun setVibratePattern(duration: Int) {
//        long[] patter = {1000, 1000, 2000, 50};數組的a[0]表示靜止的時間,a[1]代表的是震動的時間,然後數組的a[2]表示靜止的時間,a[3]代表的是震動的時間
        mPattern[1] = (duration * 16).toLong()
        mPattern[2] = (duration * 4).toLong()
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章