AndroidのUSB Host API経由でデバイスとの通信許可を取得できました。
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
protected void execute(Context ctxt) {
UsbManager manager = (UsbManager) viewer.getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
UsbDevice d = null;
for (String s : deviceList.keySet()) {
d = deviceList.get(s);
}
PendingIntent mPermissionIntent = PendingIntent.getBroadcast(ctxt, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
viewer.registerReceiver(mUsbReceiver, filter);
manager.requestPermission(d, mPermissionIntent);
}
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if(device != null){
Log.d(TAG, "Permission granted!");
}
}
else {
Log.d(TAG, "permission denied for device " + device);
}
}
}
}
};
残念ながら、これは NDK コードにこのデバイスと直接通信する許可を与えません (これは libusb に必要です)。ルートなしで Java から NDK にアクセス許可を「転送」する方法はありますか?
PS 私は UNIX ソケットを使用して、元の File Decirptor を Java から Android ネイティブ実行可能ファイルに転送することになりました ( https://github.com/martinmarinov/rtl_tcp_andro-でプロジェクトを GNU で編集しました)。一部の人々にとっては、NDK を使用して (サードパーティのアプリではなく) デバイスに直接接続している可能性があるため、さらに簡単になり、Java で使用するポインターは、UNIX をいじる必要なく NDK からアクセスできる場合があります。ソケット。