Starting March 27, 2025, we recommend using android-latest-release
instead of aosp-main
to build and contribute to AOSP. For more information, see Changes to AOSP.
Stylus
Stay organized with collections
Save and categorize content based on your preferences.
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.
Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
Last updated 2025-08-29 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-29 UTC."],[],[],null,["# Stylus\n\nAndroid 6.0 and higher supports a standard data format for Bluetooth stylus\nconnections over Bluetooth (BT), Bluetooth Low Energy (BTLE), or USB. The\nplatform correlates timing between touch input and stylus data then provides\nstylus data to render MotionEvents to the active app. The following\nsections provide guidelines for OEM device implementers, stylus accessory creators, and\nstylus app developers.\n\nGuidelines for OEM device implementers\n--------------------------------------\n\nTo enable Bluetooth stylus support, OEM device implementers must support Bluetooth\n(and should support BTLE for wider compatibility). The platform handles data\ncollection, timing correlation, and rendering to the app for supported\nstylus events.\n\nIn 14 and higher,\n`StylusButtonInputEventTest` emulates the behavior of a connected stylus and tests\nthat button events are reported correctly. As a\nworkaround for lower versions, we recommend creating a stylus accessory or emulator that can\nsimulate stylus events.\n\nGuidelines for stylus accessory creators\n----------------------------------------\n\nTo implement support on a stylus device, device implementers must use the Stylus\nHuman Interface Device (HID) Descriptor shown below to describe how stylus data\n(pressure sensitivity, eraser, buttons, device ID, battery level, charging status, etc.) is\nrepresented. The stylus device sends the HID information to the Android mobile device,\nenabling the platform to correlate HID data with touch data from the touchscreen\nto produce stylus events using the\n[`MotionEvent`](//developer.android.com/reference/android/view/MotionEvent)\nclass. In Android 14 and higher, button presses on the stylus also generate\ninternal events using the\n[`KeyEvent`](//developer.android.com/reference/android/view/KeyEvent) class.\nData can be sent over Bluetooth (BT), Bluetooth Low Energy (BTLE), or USB.\n\n### Example HID descriptor\n\nThe 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. \n\n```\nUsagePage(Digitizer)\nUsage(Pen)\nCollection(Application)\n Usage(Stylus)\n Collection(Logical)\n Usage(Tip Pressure)\n Logical Minimum(0)\n Logical Maximum(1023)\n Report Count(1)\n Report Size(10)\n Input(Data, Variable, Absolute, No Null)\n\n Usage(Barrel Switch)\n Usage(Secondary Barrel Switch)\n Usage(Tip Switch)\n Usage(Invert)\n Logical Maximum(1)\n Report Count(4)\n Report Size(1)\n Input(Data, Variable, Absolute, No Null)\n\n Usage(Transducer Serial Number)\n Report Count(1)\n Report Size(128)\n Feature(Constant, Variable)\n EndCollection\nEndCollection\n\nunsigned char HID_DESC[] = {\n 0x05, 0x0D, // UsagePage(Digitizer)\n 0x09, 0x02, // Usage(Pen)\n 0xA1, 0x01, // Collection(Application)\n 0x09, 0x20, // Usage(Stylus)\n 0xA1, 0x02, // Collection(Logical)\n 0x09, 0x30, // Usage(Tip Pressure)\n 0x15, 0x00, // Logical Minimum(0)\n 0x26, 0xFF, 0x03, // Logical Maximum(1023)\n 0x95, 0x01, // Report Count(1)\n 0x75, 0x0A, // Report Size(10)\n 0x81, 0x02, // Input(Data, Variable, Absolute, No Null)\n\n 0x09, 0x44, // Usage(Barrel Switch)\n 0x09, 0x5A, // Usage(Secondary Barrel Switch)\n 0x09, 0x42, // Usage(Tip Switch)\n 0x09, 0x3C, // Usage(Invert)\n 0x25, 0x01, // Logical Maximum(1)\n 0x95, 0x04, // Report Count(4)\n 0x75, 0x01, // Report Size(1)\n 0x81, 0x02, // Input(Data, Variable, Absolute, No Null)\n\n 0x09, 0x5B, // Usage(Transducer Serial Number)\n 0x95, 0x01, // Report Count(1)\n 0x75, 0x80, // Report Size(128)\n 0xB1, 0x03, // Feature(Constant, Variable)\n 0xC0, // End Collection\n 0xC0, // End Collection\n}\n```\n\nGuidelines for stylus app developers\n------------------------------------\n\nThe Android platform automatically handles pairing and event correlation,\nso both existing and new apps support Bluetooth stylus by default. To learn more about\nsupporting styluses in Android apps, see the\n[Android Developer documentation](https://developer.android.com/develop/ui/views/touch-and-input/stylus)."]]