2021年5月15日 星期六

如何執行手機震動功能

要求權限
Manifest(AndroidManifest.xml) 裡加上權限要求
<uses-permission android:name=
"com.android.launcher.permission.VIBRATE" />


import 會用到的物件類別
import android.os.VibratorEffect;
import android.os.Vibrator;
android.os.Build;


設定相關參數
int streng = 100;
int min = 4;
int streng = VibrationEffect.DEFAULT_AMPLITUDE;
啟動震動功能
//使用 Context.getSystemService 建立Vibrator物件
Vibrator myVibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
      myVibrator.vibrate(VibrationEffect.createOneShot ( min * 1000, streng));
}
else
{      myVibrator.vibrate(min * 1000, streng);
        //SDK 較舊的狀況下,執行舊版函式
}


停止震動
myVibrator.cancel();


Vibrator 類別

Vibrator
android.os.Vibrator
用以操作裝置震動功能的類別
官方文件: Vibrator


vibrate 函式

Vibrator.vibrate
void vibrate(VibrationEffect vibe)
接收一個 VibrationEffect 物件
執行物件裡設定的震動模式
官方文件: vibrate


VibrationEffect 類別

VibVibrationEffectator
android.os.VibrationEffect
用來描述震動功能,供 vibrate 物件使用
官方文件: VibrationEffect



createOneShot 函式

VibrationEffect.createOneShot
VibrationEffect createOneShot(long milliseconds, int amplitude)
建立一次性震動的 VibrationEffect 物件
傳入時間(milliseconds,毫秒), 以及震動強度(amplitude)
震動強度的值必需在 1 ~ 255
或是 DEFAULT_AMPLITUDE(-1)
官方文件: createOneShot


DEFAULT_AMPLITUDE

VibrationEffect.DEFAULT_AMPLITUDE
VibrationEffect 定義常數
內容為 -1 (0xffffffff)
指示使用該設備的震動強度預設值
官方文件: DEFAULT_AMPLITUDE


停止震動

在設定的時間或次數到了後
震動會自動停止

但如果想在之前中斷
可以使用 cancel() 函式

Vibrator.cancel()
void Vibrator.cancel();
官方文件: Vibrator.cancel


不需要取回原先開啟震動的 Vibrator Object
所以也可以直接新建立一個 Vibrator 物件

因此也可以寫成:

((Vibrator) this.getSystemService(Service.VIBRATOR_SERVICE)).cancel();


SDK 版本確保

VibrationEffect 需要在 SDK > android.os.Build.VERSION_CODES.O 的環境執行
如果沒加上版本確保的動作,compiler 不會通過

如果只想 compiler 通過的話
只要函式前加上 RequiresApi 即可
@RequiresApi(api = Build.VERSION_CODES.O)
private void vibrateOneshot{
     ...
}

或是在執行前判斷 SDK 版本

if (android.os.Build.VERSION.SDK_INT >=
        android.os.Build.VERSION_CODES.O)
 {
        執行程式
 }


但無法確保使用者的 SDK 版本,建議用以下方式
依 SDK 版本決定執行方式
if (android.os.Build.VERSION.SDK_INT > = Build.VERSION_CODES.O)
 {
        執行新版
 }
 else
 {
        執行舊版
 }

如果覺得 Build.VERSION_CODES.O 太長
也可以改成數字 [ 26 ]( API level 26)
if (android.os.Build.VERSION.SDK_INT > = 26 )
{
... }

這裡可以查到版本對應

相關文章

如何讓手機有節奏的震動

相關資源

Vibrator 官方文件

VibrationEffect 官方文件

API level 官方文件