1

我只想在设备支持手写笔输入时才显示菜单项。

不幸的是,我没有发现任何检查设备或显示器是否支持手写笔/Spen 进行输入。

编辑:使用 event.getToolType() 触发 MotionEvent 后,我​​可以区分 Stylus 和 Finger。如果工具类型是 TOOL_TYPE_STYLUS,我可以确定它支持手写笔。如果不是,我可以猜测是否有压力 > 0(与如何检测 Android 设备中的屏幕是电容性还是电阻性有关?

但我想在我的活动的 onCreate 方法中知道它。

以下不知何故不受支持,对我不起作用。

Configuration config = getResources().getConfiguration();
if (config.touchscreen == Configuration.TOUCHSCREEN_STYLUS)
    Toast.makeText(this, "TOUCHSCREEN_STYLUS", Toast.LENGTH_SHORT).show();
4

4 回答 4

4

您可以通过 InputManager 非常可靠地检测 S-Pen 和其他手写笔:

    boolean sPen = false;
    if(Build.VERSION.SDK_INT > 15) {
        InputManager inptmgr = (InputManager)getSystemService(INPUT_SERVICE);
        int[] inputs = inptmgr.getInputDeviceIds();
        for(int i = 0;i<inputs.length;i++) {
            if(inptmgr.getInputDevice(inputs[i]).getName().toLowerCase().contains("pen")) sPen = true;
        }
    }

通常设备会使用其中包含的适当名称进行注册,例如“蓝牙鼠标”、“罗技 USB 键盘”或“E_Pen”

于 2015-04-08T00:41:24.733 回答
3

在这里(来自 Android 文档)- 似乎只在 4.0 及更高版本中受支持。 http://developer.android.com/about/versions/android-4.0.html

Android 现在提供 API,用于接收来自手写笔输入设备的输入,例如数字化平板外围设备或支持手写笔的触摸屏。

触控笔输入的操作方式与触摸或鼠标输入类似。当触控笔与数字化仪接触时,应用程序会接收触摸事件,就像使用手指触摸显示器时一样。当触控笔悬停在数字化仪上方时,应用程序会收到悬停事件,就像在未按下任何按钮时鼠标指针在显示屏上移动时一样。

您的应用程序可以通过使用getToolType()查询与 MotionEvent 中的每个指针关联的“工具类型”来区分手指、鼠标、触控笔和橡皮擦输入。当前定义的工具类型是:TOOL_TYPE_UNKNOWNTOOL_TYPE_FINGERTOOL_TYPE_MOUSETOOL_TYPE_STYLUSTOOL_TYPE_ERASER。通过查询工具类型,您的应用程序可以选择以不同于手指或鼠标输入的方式处理触控笔输入。

您的应用程序还可以通过使用getButtonState()查询 MotionEvent 的“按钮状态”来查询按下了哪些鼠标或触控笔按钮 。当前定义的按钮状态为: BUTTON_PRIMARYBUTTON_SECONDARYBUTTON_TERTIARYBUTTON_BACKBUTTON_FORWARD。 为方便起见,后面和前进鼠标按钮会自动映射到KEYCODE_BACKKEYCODE_FORWARD键。您的应用程序可以处理这些键以支持基于鼠标按钮的后退和前进导航。

除了精确测量触点的位置和压力​​外,一些手写笔输入设备还报告手写笔尖端和数字化仪之间的距离、手写笔倾斜角度和手写笔方向角。您的应用程序可以使用带有轴代码AXIS_DISTANCEAXIS_TILTAXIS_ORIENTATION的getAxisValue()查询此信息。

于 2012-07-19T17:27:25.600 回答
1

@Aaron Gillion 的答案看起来是可行的,但是将函数检测信任到名称看起来不是 100% 可靠的。

我检查了标准的 AndroidInputDevice并发现了一些有趣的功能supportsSource,如果设备支持例如SOURCE_STYLUS. 这里有一个例子:

if (Build.VERSION_CODES.JELLY_BEAN <= Build.VERSION.SDK_INT) {
    InputManager im = (InputManager) context.getSystemService(INPUT_SERVICE);
    for (int id : im.getInputDeviceIds()) {
        InputDevice inputDevice = im.getInputDevice(id);
        if (
                inputDevice.supportsSource(InputDevice.SOURCE_STYLUS) ||
                inputDevice.supportsSource(InputDevice.SOURCE_BLUETOOTH_STYLUS)
        )
            return true;
    }
}
return false;

如果你追求更低的 SDK,你可以内联supportsSource函数,这非常简单:

public boolean supportsSource(int source) {
    return (mSources & source) == source;
}

和常数:

added in 23 - SOURCE_BLUETOOTH_STYLUS = 0x00008000 | SOURCE_STYLUS
added in 14 - SOURCE_STYLUS = 0x00004000 | SOURCE_CLASS_POINTER
added in  9 - SOURCE_CLASS_POINTER = 0x00000002 from 9

我已经在几个设备上测试了代码,它正确地检测到了手写笔。如果您能分享在非三星设备上检测手写笔的结果,我将不胜感激。

于 2020-10-30T20:47:23.810 回答
0

我认为没有任何东西可以检测手写笔输入。我假设如果设备具有触摸功能,它也可以响应手写笔。据我所知,Android 并不专门支持手写笔输入。

于 2012-07-19T17:23:21.457 回答