我想仅在设备支持手写笔输入时才显示菜单项。
不幸的是,我发现没有检查设备或显示器是否支持手写笔/ 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();
答案 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
我已经在几个设备上测试了代码,并且可以正确检测到手写笔。如果您可以分享在非三星设备上检测笔的结果,我将不胜感激。