触控笔

Android 6.0 及更高版本支持通过蓝牙 (BT)、蓝牙低功耗 (BTLE) 或 USB 进行蓝牙触控笔连接的标准数据格式。该平台关联触摸输入和触控笔数据之间的时间,然后提供触控笔数据以将 MotionEvent 呈现到活动应用。以下部分为 OEM 设备实施者、触控笔配件创建者和触控笔应用开发者提供了指南。

OEM 设备实施者指南

为了启用蓝牙手写笔支持,OEM 设备制造商必须支持蓝牙(并且应支持 BTLE 以获得更广泛的兼容性)。平台会处理数据收集、时间相关性和渲染到应用以支持的手写笔事件。

在 14 及更高版本中,StylusButtonInputEventTest 模拟连接的手写笔的行为,并测试按钮事件是否正确报告。作为较低版本的解决方法,我们建议创建手写笔配件或模拟器,以模拟手写笔事件。

手写笔配件创建者指南

为了在手写笔设备上实现支持,设备制造商必须使用下面显示的手写笔人机接口设备 (HID) 描述符来描述如何表示手写笔数据(压力感应、橡皮擦、按钮、设备 ID、电池电量、充电状态等)。手写笔设备将 HID 信息发送到 Android 移动设备,使平台能够将 HID 数据与触摸屏的触摸数据相关联,从而使用 MotionEvent 类生成手写笔事件。在 Android 14 及更高版本中,按下手写笔上的按钮也会使用 KeyEvent 类生成内部事件。数据可以通过蓝牙 (BT)、蓝牙低功耗 (BTLE) 或 USB 发送。

HID 描述符示例

以下示例 HID 描述符报告笔尖接触、压力、主要和辅助按钮、橡皮擦和序列号。您包含的 HID 描述符应准确反映手写笔通过蓝牙报告的内容,这可以是可用功能的任何子集。
UsagePage(Digitizer)
Usage(Pen)
Collection(Application)
    Usage(Stylus)
    Collection(Logical)
        Usage(Tip Pressure)
        Logical Minimum(0)
        Logical Maximum(1023)
        Report Count(1)
        Report Size(10)
        Input(Data, Variable, Absolute, No Null)

        Usage(Barrel Switch)
        Usage(Secondary Barrel Switch)
        Usage(Tip Switch)
        Usage(Invert)
        Logical Maximum(1)
        Report Count(4)
        Report Size(1)
        Input(Data, Variable, Absolute, No Null)

        Usage(Transducer Serial Number)
        Report Count(1)
        Report Size(128)
        Feature(Constant, Variable)
    EndCollection
EndCollection

unsigned char HID_DESC[] = {
    0x05, 0x0D, // UsagePage(Digitizer)
    0x09, 0x02, // Usage(Pen)
    0xA1, 0x01, // Collection(Application)
    0x09, 0x20, // Usage(Stylus)
    0xA1, 0x02, // Collection(Logical)
    0x09, 0x30, // Usage(Tip Pressure)
    0x15, 0x00, // Logical Minimum(0)
    0x26, 0xFF, 0x03, // Logical Maximum(1023)
    0x95, 0x01, // Report Count(1)
    0x75, 0x0A, // Report Size(10)
    0x81, 0x02, // Input(Data, Variable, Absolute, No Null)

    0x09, 0x44, // Usage(Barrel Switch)
    0x09, 0x5A, // Usage(Secondary Barrel Switch)
    0x09, 0x42, // Usage(Tip Switch)
    0x09, 0x3C, // Usage(Invert)
    0x25, 0x01, // Logical Maximum(1)
    0x95, 0x04, // Report Count(4)
    0x75, 0x01, // Report Size(1)
    0x81, 0x02, // Input(Data, Variable, Absolute, No Null)

    0x09, 0x5B, // Usage(Transducer Serial Number)
    0x95, 0x01, // Report Count(1)
    0x75, 0x80, // Report Size(128)
    0xB1, 0x03, // Feature(Constant, Variable)
    0xC0, // End Collection
    0xC0, // End Collection
}

手写笔应用开发者指南

Android 平台自动处理配对和事件关联,因此现有应用和新应用默认情况下都支持蓝牙手写笔。要了解有关在 Android 应用中支持手写笔的更多信息,请参阅 Android 开发者文档