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

时间:2017-04-08 19:29:54

标签: android

如何在Samsung Galaxy S8上编程Bixby按钮(KeyCode:1082),它将启动我的应用而不是Bixby启动器? App All in one Gestures已经使用自定义键执行此功能,但我如何以编程方式在Android中执行此操作?

1 个答案:

答案 0 :(得分:2)

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

Samsung has Removed the Ability to Remap the Bixby Button on the Galaxy S8/S8+

All in one Gestures使用AccessibilityService来完成此任务。您的应用也可以这样做,但用户必须在设备设置中明确启用您的应用作为辅助功能服务才能运行。

Bixby按钮显然会发出简单的KeyEvent,其密钥代码为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() {}
}

您需要在清单中正确注册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>

上面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"
/>

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