【问题标题】:Is there any way to check if device supports stylus input?有什么方法可以检查设备是否支持手写笔输入?
【发布时间】:2020-10-31 05:03:37
【问题描述】:

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

不幸的是,我没有发现任何检查设备或显示器是否支持手写笔/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();

【问题讨论】:

    标签: android types screen


    【解决方案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;
            }
        }
    

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

      • 这不是我的问题。我知道它支持带有 TOOL_TYPE_STYLUS 的运动事件后的触控笔。我想在我的应用程序开始时知道这一点。
      • 但技术上不是所有设备都支持手写笔,只要它是电容式手写笔? ICS 4.0 正式支持手写笔,但我倾向于认为所有设备通常都支持电容式手写笔。只是我的 0.02 美元 - 在我的脑海中对我来说是有意义的。
      【解决方案3】:

      @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
      

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

      【讨论】:

      • 适用于 Pixelbook (ChromeOS)
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-19
        • 2015-11-15
        • 1970-01-01
        • 1970-01-01
        • 2018-09-03
        • 1970-01-01
        • 2014-10-24
        相关资源
        最近更新 更多