TAP

Android SDK

TapSdk auto-connects paired devices and can manage Text ↔ Controller across the activity lifecycle.

  1. Package
  2. Install
  3. Hello Tap
  4. TapListener
  5. Modes
  6. Raw sensors
  7. TapXR
  8. Haptics

Package

SourceTapWithUs/tap-android-sdk
LicenseApache 2.0
StatusOfficial · Maven 0.3.6
LanguageJava / Kotlin

Install

Require Maven Central, then:

build.gradle
implementation 'io.github.tapwithus:tap-android-sdk:0.3.6'

Hello Tap

MainActivity.java
TapSdk sdk = TapSdkFactory.getDefault(this);

sdk.registerTapListener(new TapListener() {
    @Override
    public void onTapConnected(@NonNull String tapIdentifier) {
        Log.d("Tap", "connected " + tapIdentifier);
    }

    @Override
    public void onTapDisconnected(@NonNull String tapIdentifier) {
        Log.d("Tap", "disconnected " + tapIdentifier);
    }

    @Override
    public void onTapInputReceived(@NonNull String tapIdentifier, int data, int repeatData) {
        boolean[] fingers = TapSdk.toFingers(data);
        Log.d("Tap", "combination=" + data + " repeat=" + repeatData);
        // fingers[0]=thumb … fingers[4]=pinky
    }

    @Override
    public void onMouseInputReceived(@NonNull String tapIdentifier, @NonNull MousePacket data) { }

    @Override
    public void onAirMouseInputReceived(@NonNull String tapIdentifier, @NonNull AirMousePacket data) { }

    @Override
    public void onRawSensorInputReceived(@NonNull String tapIdentifier, @NonNull RawSensorData rsData) { }

    @Override public void onBluetoothTurnedOn() { }
    @Override public void onBluetoothTurnedOff() { }
    @Override public void onTapStartConnecting(@NonNull String tapIdentifier) { }
    @Override public void onTapResumed(@NonNull String tapIdentifier) { }
    @Override public void onTapChanged(@NonNull String tapIdentifier) { }
    @Override public void onTapShiftSwitchReceived(@NonNull String tapIdentifier, int data) { }
    @Override public void onTapChangedState(@NonNull String tapIdentifier, int state) { }
    @Override public void onError(@NonNull String tapIdentifier, int code, @NonNull String description) {
        Log.e("Tap", description);
    }
});

// Hook activity lifecycle so Text mode is restored in background:
@Override protected void onResume() { super.onResume(); sdk.resume(); }
@Override protected void onPause() { sdk.pause(); super.onPause(); }
NOTEPair Tap in Android Bluetooth settings first. The SDK connects to paired devices; it does not discover unpaired Taps.

TapListener

Entry point: TapSdkFactory.getDefault(context) or construct TapSdk with TapBluetoothManager. Register with registerTapListener. Combination onTapInputReceived uses the same 1–31 bitmask as other platforms; repeatData is 1/2/3 for single/double/triple.

Modes

java
sdk.startControllerMode(tapIdentifier);
sdk.startTextMode(tapIdentifier);
sdk.startControllerWithMouseHIDMode(tapIdentifier);
sdk.startControllerWithFullHIDMode(tapIdentifier);
sdk.startRawSensorMode(tapIdentifier, (byte)0, (byte)0, (byte)0);
sdk.setDefaultMode(mode, true); // applyImmediate

By default the SDK switches to Controller on connect and back to Text when backgrounded (unless you disable pause/resume handling).

Raw sensors

java
sdk.startRawSensorMode(tapIdentifier, (byte)0, (byte)0, (byte)0);

// in onRawSensorInputReceived:
if (rsData.dataType == RawSensorData.DataType.Device) {
    Point3 thumb = rsData.getPoint(RawSensorData.iDEV_THUMB);
} else if (rsData.dataType == RawSensorData.DataType.IMU) {
    Point3 gyro = rsData.getPoint(RawSensorData.iIMU_GYRO);
}

TapXR

Spatial Control features are for qualified TapXR developers. Request access. See README for TapXRState and XR air-gesture constants 100–102.

Haptics

java
sdk.vibrate(tapIdentifier, new int[] { 500, 100, 500 });