Tôi đã có thể nhận được sự cho phép để giao tiếp với một thiết bị thông qua API Máy chủ lưu trữ USB của Android.Quyền USB thu được thông qua android.hardware.usb không áp dụng cho 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);
}
}
}
}
};
Thật không may là không cho phép mã NDK của tôi giao tiếp trực tiếp với thiết bị này (cần thiết cho libusb). Có cách nào để "chuyển" các quyền từ Java sang NDK không có gốc không?
P.S. Tôi đã kết thúc bằng cách sử dụng ổ cắm UNIX để chuyển File Descirptor ban đầu từ Java sang tệp thực thi gốc của Android (Tôi có GNU-ed dự án tại https://github.com/martinmarinov/rtl_tcp_andro-). Đối với một số người, việc này có thể dễ dàng hơn vì họ có thể đang sử dụng NDK để kết nối trực tiếp với thiết bị (không phải ứng dụng của bên thứ ba) và do đó con trỏ mà họ sử dụng trong Java vẫn có thể truy cập được bởi NDK mà không cần phải gây rối Ổ cắm UNIX.
Vì vậy, bạn có nghĩa là bất cứ khi nào tôi truy cập vào các thiết bị USB thông qua Java USB Host API, tôi thực sự sử dụng một proxy chạy như là người chủ để làm việc giao tiếp và do đó nó là một trong những điều chỉnh quyền truy cập vào thiết bị này? –
Truy cập USB trong Android có nghĩa là có quyền truy cập/dev/bus/usb/*. Quyền này được thiết lập tĩnh thông qua tệp kê khai. Bạn có thể truy cập trực tiếp vào các thiết bị qua NDK, nhưng mỗi thiết bị Android có các chip phần cứng USB khác nhau, trình điều khiển, v.v. Tôi nghĩ cách duy nhất để ứng dụng hoạt động trên các thiết bị Android là thông qua giao diện máy chủ Java SDK được hỗ trợ, sử dụng trình điều khiển của nhà cung cấp. Xem [libusb trên Android] (http://libusb.6.n5.nabble.com/libusb-on-Android-td4997105.html) –
Câu trả lời này là nhầm lẫn, vì khả năng chuyển các bộ mô tả tệp thông qua các khe cắm unix (một khả năng cũng được sao chép trong Binder IPC của riêng Android, vì vậy rõ ràng không phải là một khả năng không thể chấp nhận được) thực tế cung cấp một cách hạn chế để chuyển quyền. –