アプリはVibratorServiceを介してデバイスを振動させることができます。
AndroidバージョンごとにAPIの変更があり、以前のSDKの実装方法から最近(Android 12以降)SDKの実装方法をすべて紹介します。
自分のアプリがSDK API 30(Android 12)以上にコンパイルされている場合は、レガシーの例を見てみてください。Android 12のサンプルコードをご覧ください。
1.バイブレーター의SDKAPIの履歴
これまでAndroidバージョンアップデートによるVibrator APIの変更簡単にまとめました。
1.1 Android O(API 26)未満
Android O(API 26)未満のバージョンでは、Vibratorが提供されており、次のAPIを使用して振動を発生させました。これらのAPIはAndroid OでDeprecatedされています。
Vibrator.vibrate(long milliseconds)
Vibrator.vibrate(long[] pattern, int repeat)
1.2 Android O(API 26)以上、Android 11(API 30)以下
Android O(API 26)以降では、VibrationEffectを引数として渡される Vibrate()
API が追加され、これを使って振動を発生させるように推奨しています。
Vibrator.vibrate(VibrationEffect vibe)
1.3 Android 12(API 31)以上
Android 12ではVibratorがdeprecatedされました。代わりにVibratorManagerが追加されました。将来VibratorManagerを使用する必要があります。
2. Example: vibrate() を使用した振動発生 (API 26 未満)
Target SDK APIごとに、振動を発生させる例を紹介します。
Vibrator オブジェクトは次のように取得できます。
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
Vibrator.vibrator()
API は以下の機能を提供します。
- 振動発生(1回
- パターン振動発生(1回
- 振動半
完全なコードはGitHub - Vibrationで確認できます。
2.1振動発生(1回)
vibrate()
で時間を引数に渡すと、その時間だけ振動が発生します。時間の単位はミリ秒です。
次のコードを実行すると、200msの振動が1回発生します。
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vibrator.vibrate(200) // 200 ms
2.2パターン振動発生(1回)
次のようにパターン配列を引数に渡すと、入力されたパターンで振動が発生します。 2番目の引数は反復を意味し、0
が反復、-1
は反復しないことを意味します。
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
val pattern = longArrayOf(100, 200, 100, 200, 100, 200)
vibrator.vibrate(pattern, -1)
パターン配列において、偶数インデックスは待機する時間であり、奇数インデックスは振動が発生する時間を意味する。
Index 0: 100 // wait for 100ms
Index 1: 200 // vibrate for 200ms
Index 2: 100 // wait for 100ms
Index 3: 200 // vibrate for 200ms
Index 4: 100 // wait for 100ms
Index 5: 200 // vibrate for 200ms
2.3 振動の繰り返し
以下のコードはパターン振動が発生し、無限に振動を発生させます。引数 Repeat = 0
は無限に繰り返すという意味です。
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
val pattern = longArrayOf(100, 200, 100, 200, 100, 200)
vibrator.vibrate(pattern, 0)
繰り返しを止めるには、次のように cancel()
を呼び出すだけです。
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vibrator.cancel()
2.4 振動のキャンセル
繰り返しを止めたり振動をキャンセルしたりするには、次のように cancel()
を呼び出すだけです。
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vibrator.cancel()
3. Example: VibrationEffectを使用した振動発生(API 26以上、API 30以下)
VibrationEffect は、次のオブジェクト生成メソッドを提供します。
- VibrationEffect.createOneShot()
- VibrationEffect.createWaveform()
完全なコードはGitHub - Vibrationで確認できます。
3.1振動発生(1回)
パターンのない振動を発生させるには、 VibrationEffect.createOneShot()
で VibrationEffect を生成する必要があります。
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
val effect = VibrationEffect.createOneShot(
200, VibrationEffect.DEFAULT_AMPLITUDE)
vibrator.vibrate(effect)
最初の要因は発生させる振動時間で、単位はミリ秒です。
2番目の要因は振動強度で、 1 ~ 255
の値を渡す必要があります。デフォルトの振動強度を使用するには、 DEFAULT_AMPLITUDE
を渡すだけです。
3.2パターン振動発生(1回)
パターンで振動を発生させるには、 Vibrator.createWaveform()
で VibrationEffect を生成する必要があります。
createWaveform()
の最初の引数としてパターンが渡され、2番目の引数はRepeatで、-1
は繰り返さない、0
以上は繰返しを意味します。
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val effect = VibrationEffect.createWaveform(timing, -1)
vibrator.vibrate(effect)
パターン配列の偶数インデックスは待ち時間、奇数インデックスは振動が発生する時間です。
Index 0: 100 // wait for 100ms
Index 1: 200 // vibrate for 200ms
Index 2: 100 // wait for 100ms
Index 3: 200 // vibrate for 200ms
Index 4: 100 // wait for 100ms
Index 5: 200 // vibrate for 200ms
3.3パターン(振動強度調整)振動発生(1回)
伝達されるパターンの振動強度を調整することもできます。
次のように、振動パターンと同じ長さの振動強度配列を係数に渡します。
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val amplitudes = intArrayOf(0, 50, 0, 100, 0, 200)
val effect = VibrationEffect.createWaveform(timing, amplitudes, -1)
vibrator.vibrate(effect)
振動パターンと振動強度配列の長さはすべて同じでなければなりません。パターンの0番Indexは振動強度の0番Indexに対応します。
つまり、次のように動作します。
Index 0: 100 // wait for 100ms, Amplitude: 0
Index 1: 200 // vibrate for 200ms, Amplitude: 50
Index 2: 100 // wait for 100ms, Amplitude: 0
Index 3: 200 // vibrate for 200ms, Amplitude: 50
Index 4: 100 // wait for 100ms, Amplitude: 0
Index 5: 200 // vibrate for 200ms, Amplitude: 50
3.4 振動の繰り返し
createWaveform()
の最後の引数で振動を繰り返すかどうかを決定します。 -1
は繰り返さない、0
以上はパターンのIndexから配列の最後まで繰り返すことを意味します。
つまり、下のコードでrepeat引数を0に渡すと、パターン振動が一度発生し、0番目のIndexから最後まで無限に繰り返されます。 (Index 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 0 -> 1 ...)
val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val amp = intArrayOf(0, 50, 0, 100, 0, 200)
val effect = VibrationEffect.createWaveform(timing, amp, 0)
vibrator.vibrate(effect)
もしrepeat因子で4を渡すと、パターン振動を一度発生させ、Index 4から5までを無限に繰り返します。 (Index 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 4 -> 5 -> 4 -> 5 -> 4 ...)
val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val amp = intArrayOf(0, 50, 0, 100, 0, 200)
val effect = VibrationEffect.createWaveform(timing, amp, 4)
vibrator.vibrate(effect)
3.5 振動キャンセル
繰り返しを止めたり振動をキャンセルしたりするには、次のように cancel()
を呼び出すだけです。
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vibrator.cancel()
4. Example: Android 12のVibrationManagerを使用した振動発生(API 31以上)
Android 12でVibratorManagerが追加され、次のようにVibratorManagerをインポートできます。
private val vibratorManager: VibratorManager by lazy {
getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
}
完全なコードはGitHub - VibratorManagerInAndroid12で確認できます。
4.1振動発生(1回)
次のコードを実行すると、500msの振動が1回発生します。
val vibrationEffect = VibrationEffect.createOneShot(
500L,
VibrationEffect.DEFAULT_AMPLITUDE
)
val combinedVibration = CombinedVibration.createParallel(vibrationEffect)
vibratorManager.vibrate(combinedVibration)
最初の要因は発生させる振動時間で、単位はミリ秒です。 2番目の要因は振動強度で、1〜255の値を渡す必要があります。デフォルトの振動強度を使用するには、DEFAULT_AMPLITUDEを渡すだけです。
4.2パターン振動発生(1回)
以下のコードは、設定したパターンで1回の振動を発生させます。
val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val vibrationEffect = VibrationEffect.createWaveform(timing, -1)
val combinedVibration = CombinedVibration.createParallel(vibrationEffect)
vibratorManager.vibrate(combinedVibration)
createWaveform()
の最初の引数としてパターンが渡され、2番目の引数はrepeatで、-1は繰り返さない、0以上は繰り返しを意味します。
パターン配列の偶数インデックスは待ち時間、奇数インデックスは振動が発生する時間です。
Index 0: 100 // wait for 100ms
Index 1: 200 // vibrate for 200ms
Index 2: 100 // wait for 100ms
Index 3: 200 // vibrate for 200ms
Index 4: 100 // wait for 100ms
Index 5: 200 // vibrate for 200ms
4.3パターン(振動強度調整)振動発生(1回)
伝達されるパターンの振動強度を調整することもできます。
次のように、振動パターンと同じ長さの振動強度配列を係数に渡します。引数 repeat = -1
は繰り返さないことを意味します。
val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val amplitudes = intArrayOf(0, 50, 0, 100, 0, 200)
val vibrationEffect = VibrationEffect.createWaveform(timing, amplitudes, -1)
val combinedVibration = CombinedVibration.createParallel(vibrationEffect)
vibratorManager.vibrate(combinedVibration)
振動パターンと振動強度配列の長さはすべて同じでなければなりません。パターンの0番Indexは振動強度の0番Indexに対応します。
つまり、次のように動作します。
Index 0: 100 // wait for 100ms, Amplitude: 0
Index 1: 200 // vibrate for 200ms, Amplitude: 50
Index 2: 100 // wait for 100ms, Amplitude: 0
Index 3: 200 // vibrate for 200ms, Amplitude: 50
Index 4: 100 // wait for 100ms, Amplitude: 0
Index 5: 200 // vibrate for 200ms, Amplitude: 50
4.4 振動の繰り返し
repeat 引数をゼロ以上に渡すと振動が繰り返されます。
たとえば、次のコードでrepeat引数を0に渡すと、パターン振動が一度発生し、0番目のインデックスから最後まで無限に繰り返されます。 (Index 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 0 -> 1 ...)
val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val amplitudes = intArrayOf(0, 50, 0, 100, 0, 200)
val vibrationEffect = VibrationEffect.createWaveform(timing, amplitudes, 0)
val combinedVibration = CombinedVibration.createParallel(vibrationEffect)
vibratorManager.vibrate(combinedVibration)
もしrepeat因子で4を渡すと、パターン振動を一度発生させ、Index 4から5までを無限に繰り返します。 (Index 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 4 -> 5 -> 4 -> 5 -> 4 ...)
val timing = longArrayOf(100, 200, 100, 200, 100, 200)
val amplitudes = intArrayOf(0, 50, 0, 100, 0, 200)
val vibrationEffect = VibrationEffect.createWaveform(timing, amplitudes, 4)
val combinedVibration = CombinedVibration.createParallel(vibrationEffect)
vibratorManager.vibrate(combinedVibration)
4.5 振動のキャンセル
cancel()
を呼び出すことで、動作中の振動をキャンセルできます。
vibratorManager.cancel()
Related Posts
- Android - 振動、Vibrator、VibrationEffectの例
- Android - TabLayoutの実装方法(+ ViewPager2)
- Android - PackageManagerにPackage情報を取得する
- Android - ACTION_BOOT_COMPLETEDイベント受信
- Android - FusedLocationProviderClientに位置情報を取得する
- Android - GPS、Network位置情報を取得する(LocationManager)
- Android - Foreground Service実行
- Android - 時間、日付、変更イベント受信
- Android - currentTimeMillis()、elapsedRealtime()、uptimeMillis()
- Android-PowerManager WakeLock
- Android - ファイル入出力の例(Read、Write、内部、外部ストレージ)
- Android - Screen On / Offイベントの受信、状態確認
- Android - 他のアプリのServiceにバインド
- Android - Handler vs Executor
- Android - Darkmode有効にする方法
- Android - hasSystemFeature()、サポートされているFeature確認
- Android - アプリの権限を確認(Permission check)
- Android - インストールされてアプリリストをインポートする
- Android App Shortcuts実装
- Android - ContentProviderを実装、および例
- Android - AIDLを利用して、Remote Serviceの実装
- Android - Uri、Scheme、SSP(Scheme Specific Part)説明
- Android - アプリのインストール、削除、イベントダウンロード(BroadcastReceiverインテントを受け取る)
- Android - SharedPreferencesに簡単なデータを保存する方法
- Android - AlarmManagerにアラームを登録する方法、および例
- Android - Quick SettingsにCustom Tile追加する方法(kotlin)
- Android - Broadcast Receiver登録およびイベントの受信方法
- Android - Runtime permissionリクエスト方法と例(kotlin)
- Android - ネットワーク(WIFI)の接続状態を確認し、変更の検出
- Mockito - static、final methodをmockingする方法
- Andriod - カスタムパーミッションを定義する方法
- RobolectricにUnit Testを作成する(kotlin)
- Android Mockitoのテストコードを作成する(kotlin)
- Android - Handlerの使用方法、および例
- Android - IntentService使用方法
- Android - JobIntentService使用方法