【问题标题】:How to override power and volume buttons in flutter?如何在颤动中覆盖电源和音量按钮?
【发布时间】:2021-10-11 19:57:56
【问题描述】:
我想覆盖电源或音量按钮并为其提供自定义功能。我已经尝试过硬件按钮包 (https://pub.dev/packages/hardware_buttons/example),但它未能构建并出现错误:
C:\flutter\.pub-cache\hosted\pub.dartlang.org\hardware_buttons-1.0.0\android\src\main\kotlin\flutter\moum\hardware_buttons\HardwareButtonsWatcherManager.kt: (74, 42): Object is not abstract and does not implement abstract base class member public abstract fun onActivityStarted(@NonNull p0: Activity): Unit defined in flutter.moum.hardware_buttons.EmptyActivityLifecycleCallbacks
在 Flutter 中收听电源/音量按钮按下事件的最佳方式是什么?
【问题讨论】:
标签:
android
flutter
hardware
【解决方案1】:
我也遇到过这个问题,并使用MethodChannel 和特定于平台的代码解决了它。
例如,在 Android 端,我这样做是为了调用我的颤振代码:
class MainActivity: FlutterActivity() {
private lateinit var channel : MethodChannel;
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "mychannel")
}
// using platform-specific events
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
when (keyCode) {
KeyEvent.KEYCODE_VOLUME_DOWN -> channel.invokeMethod("volumeBtnPressed", "volume_down")
KeyEvent.KEYCODE_VOLUME_UP -> channel.invokeMethod("volumeBtnPressed", "volume_up")
}
// return true means "prevent default behavior", so volume doesn't change and volume bar doesn't appear
return true
}
}
在 Flutter 方面(在 State 类中):
static const _volumeBtnChannel =
MethodChannel("mychannel");
@override
void initState() {
_volumeBtnChannel.setMethodCallHandler((call) {
if (call.method == "volumeBtnPressed") {
if (call.arguments == "volume_down") {
doMyCustomLogic();
}
}
return Future.value(null);
});
super.initState();
}
注意
另外,@Kozubi 提到 here 可以以某种方式使用 Shortcuts 类,但我不明白如何。