Android-библиотека usb-i2c-android предназначена для организации обмена данными с I²C-устройствами, подключенными с помощью OTG USB-адаптеров. Библиотека не требует специальных системных драйверов или прав доступа root.

Список поддерживаемых адаптеров в usb-i2c-android версии 1.1.0:

Пример работы I²C 0.96" OLED-дисплея, подключенного к телефону Pixel 3:

В проект также включено простое приложение-сканер устройств I²C:

Для того, чтобы использовать библиотеку в своем проекте, необходимо добавить репозиторий jitpack.io в корневой файл build.gradle:

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

Включение библиотеки в список зависимостей проекта:

dependencies {
    implementation 'com.github.3cky:usb-i2c-android:1.1.0'
}

Перед вызовом функций библиотеки, в манифест приложения необходимо добавить ключ <uses-feature> для USB-хоста:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="...">
    <uses-feature android:name="android.hardware.usb.host" />
    ...
</manifest>

Пример кода, взаимодействующего с устройством I²C (упрощенный, за подробностями можно обратиться к примеру приложения в директории app проекта):

import com.github.ykc3.android.usbi2c.UsbI2cAdapter;
import com.github.ykc3.android.usbi2c.UsbI2cDevice;
import com.github.ykc3.android.usbi2c.UsbI2cManager;
...

// Get Android UsbManager
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);

// Find all connected I²C adapters
UsbI2cManager usbI2cManager = UsbI2cManager.create(usbManager).build();
List<UsbI2cAdapter> i2cAdapters = usbI2cManager.getAdapters();
if (i2cAdapters.isEmpty()) {
    return;
}

// Get first adapter
UsbI2cAdapter i2cAdapter = i2cAdapters.get(0);

// Request USB access permission
usbManager.requestPermission(i2cAdapter.getUsbDevice(), usbPermissionIntent);
...
// USB permission intent handler called with success result

// Open adapter
i2cAdapter.open();

// Get device with I²C address 0x42
UsbI2cDevice i2cDevice = i2cAdapter.getDevice(0x42);

// Read device register 0x01.
// Throws java.lang.IOException if device is not connected or I/O error caused 
byte value = i2cDevice.readRegByte(0x01);

// Close adapter
i2cAdapter.close();