使用 appium java 在 android 设备上长按自定义物理按钮

Long press a custom physical button on android device with appium java

我有一个定制的 phone,其中有一个我需要长按的特定 SOS 按钮。

我正在尝试这样按键。

   driver.longPressKey(new KeyEvent( AndroidKey.HOME) );

可以使用,但自定义键代码为 287。我该如何发送它?我试过这样的东西

driver.longPressKey(new KeyEvent( AndroidKey.valueOf("287")) );

但这给出了一个枚举错误

版本:java-客户端:7.5.1

错误原因

AndroidKey 是枚举,valueOf 方法的工作原理如下:

AndroidKey.valueOf("HOME");

而 HOME 是在 Enum 中定义的。

public enum AndroidKey {
    UNKNOWN(0),
    ...
    HOME(3),
    ...

按自定义键码

密钥代码 287 不存在于 AndroidKey 枚举中。

但是 KeyEvent 构造函数需要它。

对于这种情况,我建议自定义 KeyEvent 子 class。

import com.google.common.collect.ImmutableMap
import io.appium.java_client.android.nativekey.KeyEvent

import static java.util.Optional.ofNullable

class MyKeyEvent extends KeyEvent {

    private int keyCode;

    public MyKeyEvent(int keyCode) {
        this.keyCode = keyCode;
    }

    @Override
    public Map<String, Object> build() {
        final ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
        final int keyCode = ofNullable(this.keyCode)
                .orElseThrow(() -> new IllegalStateException("The key code must be set"));
        builder.put("keycode", keyCode);
        return builder.build();
    }
}

长按:

driver.longPressKey(new MyKeyEvent(287));

免责声明

正如我所见,这可能有效(因为 Appium 命令执行器将获得 long-press 命令的有效结构),但我无法在某些设备上 运行 此代码或模拟器。一旦驱动程序尝试执行一些未知的关键代码,我就不知道驱动程序的行为了。

所以,如果它不起作用,请告诉我,我会尝试 improve/fix。