我能夠獲得通過Android的USB Host API的設備進行通信的許可。USB許可並不適用於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);
}
}
}
}
};
不幸的是,我的NDK代碼沒有權限直接與這個設備通信(這是libusb需要的)。有沒有辦法將權限從Java轉移到沒有root權限的NDK?
P.S. 我結束了使用Unix套接字從Java的原始文件Descirptor轉移到Android原生可執行文件(我有GNU-ED項目在https://github.com/martinmarinov/rtl_tcp_andro-)。 對於一些人來說,它會更容易,因爲他們可能使用NDK直接與設備連接(而不是第三方應用程序),因此他們在Java中使用的指針仍然可以被NDK訪問,而不必亂搞UNIX套接字。
所以你的意思是,每當我訪問通過Java USB主機API usb設備,我確實使用了以root身份運行做通信的代理,因此它是一個這是治理這個設備的訪問? Android中 –
USB存取裝置具有權限訪問的/ dev /總線/ USB/*。此權限是通過清單靜態建立的。你可以通過NDK設備直接訪問,但每個Android設備都有不同的USB硬件芯片,驅動程序等我想對於一個應用程序在Android設備上工作的唯一方法是通過支持的Java SDK主機接口,它使用供應商的司機。請參閱[Android上的libusb](http://libusb.6.n5.nabble.com/libusb-on-Android-td4997105.html) –
這個答案是錯誤的,因爲通過unix套接字傳遞文件描述符的能力也重複在Android的自身粘合劑IPC,所以顯然不是不可預見的可能性),事實上確實提供轉讓權限以有限的方式。 –