タッチペン

Android 6.0 以降では、Bluetooth(BT)、Bluetooth Low Energy(BTLE)、USB 経由での Bluetooth タッチペン接続の標準データ形式がサポートされています。プラットフォームでは、タップ入力とタッチペン データとの連携のタイミングが処理され、MotionEvent のレンダリングを行うためのタッチペン データがアクティブなアプリに提供されます。次のセクションでは、OEM デバイスの実装、タッチペン アクセサリの作成、タッチペン アプリの開発を行う際のガイドラインを示します。

OEM デバイスの実装に関するガイドライン

OEM デバイスで Bluetooth タッチペンのサポートを有効にするには、実装の際に Bluetooth をサポートする必要があります(より広範な互換性を維持するには、BTLE のサポートが必要です)。プラットフォームでは、サポート対象のタッチペン イベントにおけるデータ収集、連携タイミングの処理、アプリへのレンダリングが行われます。

14 以降では、StylusButtonInputEventTest は接続されたタッチペンの動作をエミュレートし、ボタンイベントが正しく報告されていることをテストします。下位バージョンの場合は、タッチペン イベントのシミュレーション用アクセサリーやエミュレータを作成することをおすすめします。

タッチペン アクセサリーの作成に関するガイドライン

タッチペン デバイスのサポートを実装するには、以下のタッチペン ヒューマン インターフェース デバイス(HID)記述子を使用して、タッチペン データ(感圧センサー、イレイザー、ボタン、デバイス ID、バッテリー残量、充電ステータスなど)を記述する必要があります。タッチペン デバイスは HID 情報を Android モバイル デバイスに送信して、プラットフォームで HID データとタッチスクリーンのタッチデータが連携され、MotionEvent クラスを使ってタッチペン イベントが生成されるようにします。Android 14 以降では、タッチペンのボタンの押下も KeyEvent クラスを使って内部イベントを生成します。データは Bluetooth(BT)、Bluetooth Low Energy(BTLE)、USB 経由で送信できます。

HID 記述子の例

以下のサンプル HID 記述子は、先端の接触、圧力、プライマリおよびセカンダリ ボタン、イレイザー、シリアル番号を報告します。含める HID 記述子は Bluetooth 経由でタッチペンによって報告されているものを正確に反映している必要があります。たとえば利用できる機能のサブセットなどが該当します。
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 プラットフォームでは、ペア設定とイベント間の連携が自動的に処理されます。そのため、既存のアプリと新しいアプリの両方で Bluetooth タッチペンがデフォルトでサポートされます。Android アプリでタッチペンをサポートする方法について詳細は、Android デベロッパー ドキュメントをご覧ください。