即使我的应用程序不在前面,如何接收 Bixby 按钮按下事件?

Jul*_*kli 3 android

如何对 Samsung Galaxy S8 上的 Bixby 按钮(密钥代码:1082)进行编程,使其启动我的应用程序而不是 Bixby 启动器?All in one Gestures 应用程序已经具有带有自定义按键的此功能,但是我如何在 Android 中以编程方式执行此操作?

Mik*_* M. 5

三星似乎不赞成用户这样做,并且显然在最近的更新中禁用了此功能,至少在某些地方是如此。报告各不相同,但请注意,下面的示例可能无法在所有设备上运行,或者在不久的将来根本无法运行。更多详细信息请参阅以下文章(XDA 开发人员的站外链接):

三星取消了 Galaxy S8/S8+ 上重新映射 Bixby 按钮的功能


多合一手势使用AccessibilityService来完成此操作。您的应用程序也可以执行相同的操作,但用户必须在设备设置中明确将您的应用程序启用为辅助功能服务才能正常工作。

Bixby 按钮显然会发出简单的KeyEvents,键码为 1082。您AccessibilityService只需重写该onKeyEvent()方法,并检查传入事件的键码。例如:

public class BixbyInterceptService extends AccessibilityService {

    private static final int KEYCODE_BIXBY = 1082;

    @Override
    protected boolean onKeyEvent(KeyEvent event) {
        if (event.getKeyCode() == KEYCODE_BIXBY &&
            event.getAction() == KeyEvent.ACTION_DOWN) {

            // Do your thing here; startActivity(), Toast, Notification, etc.
            Toast.makeText(this, "Bixby button pressed", 0).show();

            // Return true to stop the event from propagating further.
            return true;
        }

        return super.onKeyEvent(event);
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {}

    @Override
    public void onInterrupt() {}
}
Run Code Online (Sandbox Code Playgroud)

您需要AccessibilityService在清单中正确注册您的设备,以便用户有资格启用它。例如,<application>标签之间:

<service
    android:name=".BixbyInterceptService"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/bixby_service_config" />
</service>
Run Code Online (Sandbox Code Playgroud)

resource上面元素的属性指向<meta-data>一个 XML 文件,其中包含Service. 在项目的文件夹下,根据需要res/创建一个文件夹,并在其中添加以下文件:xml/

bixby_service_config.xml

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityFlags="flagRequestFilterKeyEvents"
    android:canRequestFilterKeyEvents="true"
/>
Run Code Online (Sandbox Code Playgroud)

安装后,您需要在设备设置的“辅助功能”部分下的“服务”中启用您的应用程序。