Flutter:platform channelsを利用してAndroidのバイブレーション機能を呼び出す

Keisuke Kawajiri
Learn about Flutter
6 min readMar 7, 2020

Flutterには、platform channelsという仕組みがあり、Android/iOS固有の機能を呼び出すことができます。
そこで今回は、Android側のバイブレーション機能を呼び出してみることにしました。
バイブレーションを選択した理由は、学習用に作成したカウントダウンタイマーに、バイブレーションによりタイムアップを知らせる機能を追加したかったからです。
以下では、platform channelsを用いたAndroidのバイブレーション機能を呼び出す実装を紹介します。

Android側の実装

MainActivityクラス中に、Flutter側からの呼び出しを受け取るMethodChannelの設定をします。
MainActivityクラスは、Flutterプロジェクトを新規で作成すると、プロジェクトのandroid配下に自動生成されています。
MethodChannelは、configureFlutterEngineメソッドをoverrideして設定していきます。
ソースコードは次の通りです。

まず、MethodChannelをインスタンス化します。
その際、第一引数は上記ソースコードと同様で大丈夫ですが、第二引数は任意の文字列(= チャンネル名)を設定します。
チャンネル名は、Flutter側からAndroid側の機能を呼び出す際に、識別子となるものです。

次に、Flutter側から呼び出される処理(ハンドラー)をMethodChannel#setMethodCallHandlerで設定します。
ハンドラーの型は、MethodChannel.MethodCallHandlerです。
MethodCallHandlerは、onMethodCallをメソッドに持つインタフェースです。上記ソースコードでは、Kotlinの省略記法でハンドラーを実装して設定しています。
ここで、ハンドラーが受け取る引数(=onMethodCallの引数)ですが、

  • methodCall:MethodCall
    Flutter側で呼び出す際に渡される情報で、argumentsとmethodプロパティを持ちます。
    これらの情報を用いると今回の実装のように、methodの値に応じて処理を切替えることができます。
  • result:MethodChannel.Result
    Flutter側へのレスポンスに使います。
    処理成功時には successを、失敗時には errorを用いてレスポンスを設定することができます。
    例えば、 result.success("success") とするとFlutter側で "success" が取得できます。

そして、今回ハンドラーにてバイブレーションを実行する処理を実装しました。
Androidのバイブレーションの実装については、次の記事が参考になりました。

Flutter側の実装

Flutter側からは次のようにAndroid側で実装した機能を呼び出します。

MethodChannel methodChannel = MethodChannel('flutter/vibration');// 周期的に振動をさせる場合
methodChannel.invokeMethod("vibrateWave");
// 振動を止める場合
methodChannel.invokeMethod("cancel");
// 一度だけ振動させる場合
methodChannel.invokeMethod("vibrateOneShot");

最初に、MethodChannelをAndroid側で設定したチャンネル名を指定して生成します。
それから、MethodChannelのinvokeMethodを呼びます。
invokeMethodの引数はハンドラーの第一引数(= methodCall:MethodCall型)に渡される情報です。
対応関係は次の通りです。

  • invokeMethodの第一引数 → MethodCallのmethod
  • invokeMethodの第二引数 → MethodCallのarguments

今回の場合、Android側でMethodCallのmethodを利用しているので、「vibrateWave/vibrateOneShot/cancel」のいずれかを第一引数に指定することになります。
また、invokeMethodの戻り値は、ハンドラーのレスポンスをFutureでラップした値です。次のように取り扱うことができます。

// レスポンスを利用する場合
try {
String result = await methodChannel.invokeMethod("vibrateWave");
// レスポンスをsuccessで返していた場合
debugPrint(result); // "success"が出力される
} on PlatformException catch (e, stackTrace) {
// レスポンスをerrorで返していた場合
// 試しにエラー情報出力する例
debugPrint(e.code);
debugPrint(e.message);
debugPrint(e.details);
debugPrint(stackTrace.toString());
} catch (e, stackTrace) {
// 他の例外があれば処理する
...
}

今回は、platform channelsを利用してAndroidのバイブレーション機能を呼び出す方法を紹介しました。
ちなみに、HapticFeedbackを利用して端末を振動させることもできます。こちらは、アイコンをタッチした時に、ユーザに触れたことを振動させて伝えたいみたいな用途に利用できます。
また、platform channelsで使いたい機能は、すでにパッケージとして提供されている場合があるので、まずはそちらを参照すると実装の手間が省けるかもしれません。詳しくは下記を参照ください。

--

--