我能够通过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所需的)。有没有办法转移&#34;转移&#34;从没有root的Java到NDK的权限?
P.S。 我最终使用UNIX套接字将原始的File Descirptor从Java传输到Android本机可执行文件(我在https://github.com/martinmarinov/rtl_tcp_andro-处对项目进行了GNU编辑)。 对于某些人来说,它会更容易,因为他们可能正在使用NDK直接连接设备(而不是第三方应用程序),因此NDK仍然可以访问他们在Java中使用的指针而不必乱用UNIX套接字。
答案 0 :(得分:2)
没有可能“转移”权限,因为Android安全模型要求每个应用程序静态声明其所需权限,并且用户在安装时批准权限集。不支持动态权限。每个应用程序映射到一个UID,其清单中具有静态声明的权限。 Java不是权限边界,Dalvik VM不是通过NDK运行本机代码的障碍。所有权限必须列在清单中,而apk可能根本不包含Java(dex)代码。
http://developer.android.com/guide/topics/security/permissions.html