有没有办法检查设备是否支持手写笔输入?

时间:2012-07-19 14:37:19

标签: android types screen

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

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

编辑: 使用event.getToolType()触发MotionEvent后,我可以区分Stylus和Finger。 如果工具类型为TOOL_TYPE_STYLUS,我可以确定它支持手写笔。 如果不是我可以猜测是否有压力> 0(与how to detect if the screen is capacitive or resistive in an Android device?相关)

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

以下某种方式不受支持,对我不起作用。

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

4 个答案:

答案 0 :(得分:3)

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

  

Android现在提供用于接收来自手写笔输入的输入的API   数字化仪平板电脑外围设备或触控笔触控设备   屏幕。

     

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

     

您的应用程序可以区分手指,鼠标,手写笔和   通过查询与每个指针相关联的“工具类型”来进行橡皮擦输入   在使用 getToolType()的MotionEvent中。当前定义的工具类型   是: TOOL_TYPE_UNKNOWN TOOL_TYPE_FINGER TOOL_TYPE_MOUSE ,    TOOL_TYPE_STYLUS TOOL_TYPE_ERASER 。通过查询工具类型,   您的应用程序可以选择以不同方式处理手写笔输入   从手指或鼠标输入。

     

您的应用程序还可以查询哪个鼠标或手写笔按钮   通过使用查询MotionEvent的“按钮状态”来按下    getButtonState()的。当前定义的按钮状态为:    BUTTON_PRIMARY BUTTON_SECONDARY BUTTON_TERTIARY BUTTON_BACK ,以及   的 BUTTON_FORWARD 即可。为方便起见,后退和前进鼠标按钮   自动映射到 KEYCODE_BACK KEYCODE_FORWARD 键。   您的应用程序可以处理这些键以支持基于鼠标的按钮   后退和前进导航。

     

除了精确测量a的位置和压力​​外   联系人,一些手写笔输入设备也报告之间的距离   手写笔尖和数字化仪,手写笔倾斜角度和   手写笔的方向角。您的应用程序可以查询此信息   使用 getAxisValue(),轴代码 AXIS_DISTANCE AXIS_TILT ,以及   的 AXIS_ORIENTATION

答案 1 :(得分:1)

您可以通过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;
        }
    }

通常设备会使用其中包含的相应名称进行注册,例如,&#34;蓝牙鼠标&#34;,&#34;罗技USB键盘&#34;或&#34; E_Pen&#34;

答案 2 :(得分:0)

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

答案 3 :(得分:0)

@Aaron Gillion的答案似乎很有效,但将功能检测到信任的名称似乎并不100%可靠。

我检出了标准的Android InputDevice,并发现了一些有趣的功能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

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