Udało mi się uzyskać pozwolenie na komunikację z urządzeniem za pośrednictwem interfejsu USB Host API systemu Android.Uprawnienia USB uzyskane przez android.hardware.usb nie dotyczą NDK
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);
}
}
}
}
};
Niestety nie daje moje pozwolenie kodu NDK do bezpośredniego komunikowania się z tym urządzeniem (co jest potrzebne dla libusb). Czy istnieje sposób "przeniesienia" uprawnień z Java na NDK bez uprawnień roota?
P.S. Skończyło się na użyciu gniazd UNIX do przeniesienia oryginalnego File Descirptor z Java do natywnego pliku wykonywalnego Android (mam GNU-ed projektu https://github.com/martinmarinov/rtl_tcp_andro-). Dla niektórych osób byłoby to jeszcze łatwiejsze, ponieważ mogą oni używać NDK do bezpośredniego łączenia się z urządzeniem (nie jest to aplikacja innej firmy), a zatem wskaźnik, którego używają w Javie, może być nadal dostępny przez NDK bez konieczności bałagania z Gniazda UNIX.
Więc oznacza to, że gdy mam dostępu do urządzenia USB przez Java USB Host API, ja faktycznie przy użyciu serwera proxy, który jest uruchamiany jako root, aby wykonać komunikację i dlatego jest to jeden to jest zarządzanie dostępem do tego urządzenia? –
Dostęp przez USB w systemie Android oznacza posiadanie pozwolenia na dostęp do/dev/bus/usb/*. Zezwolenie to jest ustalane statycznie za pośrednictwem manifestu. Możesz uzyskać bezpośredni dostęp do urządzeń za pośrednictwem NDK, ale każde urządzenie z Androidem ma inne układy sprzętowe USB, sterowniki itp. Myślę, że jedynym sposobem na to, by aplikacja działała na urządzeniach z Androidem, jest obsługiwany interfejs hosta Java SDK, który używa sterowniki dostawcy. Zobacz [libusb na Androida] (http://libusb.6.n5.nabble.com/libusb-on-Android-td4997105.html) –
Ta odpowiedź jest błędna, jako możliwość przekazywania deskryptorów plików przez gniazda uniksowe (zdolność również powielone w Binder IPC własnego Androida, więc wyraźnie nie jest to nieprzewidziane możliwości) w rzeczywistości zapewnia ograniczony sposób przenoszenia uprawnień. –