Stylus

Android 6.0 and higher supports a standard data format for Bluetooth stylus connections over Bluetooth (BT), Bluetooth Low Energy (BTLE), or USB. The platform correlates timing between touch input and stylus data then provides stylus data to render MotionEvents to the active app. The following sections provide guidelines for OEM device implementers, stylus accessory creators, and stylus app developers.

Guidelines for OEM device implementers

To enable Bluetooth stylus support, OEM device implementers must support Bluetooth (and should support BTLE for wider compatibility). The platform handles data collection, timing correlation, and rendering to the app for supported stylus events.

In 14 and higher, StylusButtonInputEventTest emulates the behavior of a connected stylus and tests that button events are reported correctly. As a workaround for lower versions, we recommend creating a stylus accessory or emulator that can simulate stylus events.

Guidelines for stylus accessory creators

To implement support on a stylus device, device implementers must use the Stylus Human Interface Device (HID) Descriptor shown below to describe how stylus data (pressure sensitivity, eraser, buttons, device ID, battery level, charging status, etc.) is represented. The stylus device sends the HID information to the Android mobile device, enabling the platform to correlate HID data with touch data from the touchscreen to produce stylus events using the MotionEvent class. In Android 14 and higher, button presses on the stylus also generate internal events using the KeyEvent class. Data can be sent over Bluetooth (BT), Bluetooth Low Energy (BTLE), or USB.

Example HID descriptor

The following sample HID descriptor reports tip contact, pressure, primary and secondary buttons, eraser, and serial number. The HID descriptor you include should accurately reflect what is being reported by the stylus through bluetooth, which could be any subset of the available capabilities.
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
}

Guidelines for stylus app developers

The Android platform automatically handles pairing and event correlation, so both existing and new apps support Bluetooth stylus by default. To learn more about supporting styluses in Android apps, see the Android Developer documentation.