我正在创建需要USB权限的自助服务终端应用程序。它将作为我们设备上的系统应用程序添加到AOSP图像中,并且是设备所有者应用程序。
应用程序通过USB在HOST模式下控制外部设备,因此默认情况下如何获得USB权限,以便用户无需每次关闭USB设备时都给予。平板电脑将关闭外壳,因此用户无法访问它控制的USB端口和设备。
所以我希望默认情况下可以信任某些USB设备。怎么实现呢? 我如何绕过我的应用程序的android usb主机权限确认对话框。
可以使用this方法吗?
然后我发现了whitelisting设备的一些内容。 如果它可以成为可行的解决方案,明天就去尝试。
答案 0 :(得分:0)
我遇到同样的问题,在使用Device的Activity的AndroidManifest.xml中写这个
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
您还必须在xml资源中创建一个过滤器文件,例如res / xml / device_filter:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device vendor-id="26214" product-id="26214" />
</resources>
你不能调用mManager.requestPermission(device,mPermissionIntent),所以你必须直接调用mManager.openDevice(mDevice);并且您可以正常通信而无需出现权限弹出消息。
答案 1 :(得分:0)
回复
设法使意图过滤器起作用。问题在于,为平板电脑供电时,它将从用户权限中查询启动应用程序。所以我仍然得到一次查询。问题是我有2个USB设备,并且它允许第一个USB设备。 –裘德
抱歉,我无法发表评论,但是我看到的是请求许可onCreate()仅请求了一次。但是,在onResume()中请求可以很好地在多个设备上使用!我有多个对话框,而且,对话框的数量也与授予的权限的日志语句不匹配。因此,举例来说,我将只请求对一台摄像机设备和另一台设备的许可。
但是,我每次获得2个用于照相机的对话框和2个用于其他设备的对话框,并且每次接受时都有多个日志语句。像2个对话框一样,我有4个权限授予的语句,因此很难分辨内部到底发生了什么。而且这些消息每次都不一致。有时我收到2个对话框的4条消息,有时又收到3或5条消息。
但是请您附上我的代码,该代码可以正常运行,并且我可以尝试使用的两种设备都可以得到许可,
private static final String TAG = "BLH/USBTest";
private static final String ACTION_USB_PERMISSION = "com.blhealthcare.example.USB_PERMISSION";
private static final int CAM_USB_PERM_CODE = 4532;
private static final int STETH_USB_PERM_CODE = 4533;
UsbManager usbManager;
UsbDevice camDevice;
UsbDevice stethDevice;
List<UsbInterface> camInterfaces = new ArrayList<>();
List<UsbInterface> stethInterfaces = new ArrayList<>();
private boolean camPermGranted = false;
private boolean stethPermGranted = false;
private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
int reqCode = intent.getIntExtra("requestCode", 0);
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if (device != null) {
if (reqCode == CAM_USB_PERM_CODE) {
Log.d(TAG, "onReceive: Permission granted for Camera");
camPermGranted = true;
} else if (reqCode == STETH_USB_PERM_CODE) {
Log.d(TAG, "onReceive: Permission granted for Steth");
stethPermGranted = true;
}
}
} else {
Log.d(TAG, "Permission denied for device " + device);
}
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
initializeUSBDevices();
checkUSBInput();
}
// Helpers
private void requestCamPerm(Context context) {
Intent camIntent = new Intent(ACTION_USB_PERMISSION);
camIntent.putExtra("requestCode", CAM_USB_PERM_CODE);
PendingIntent camPermIntent = PendingIntent.getBroadcast(context, CAM_USB_PERM_CODE, camIntent, 0);
usbManager.requestPermission(camDevice, camPermIntent);
}
private void requestStethPerm(Context context) {
Intent stethIntent = new Intent(ACTION_USB_PERMISSION);
stethIntent.putExtra("requestCode", STETH_USB_PERM_CODE);
PendingIntent stethPermIntent = PendingIntent.getBroadcast(context, STETH_USB_PERM_CODE, stethIntent, 0);
usbManager.requestPermission(stethDevice, stethPermIntent);
}
private void initializeUSBDevices() {
String camvId = "4f2";
String stethvId = "d8c";
camDevice = getUsbDeviceFromVid(camvId);
stethDevice = getUsbDeviceFromVid(stethvId);
}
private UsbDevice getUsbDeviceFromVid(String vid) {
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
if (usbManager != null) {
for (UsbDevice d : usbManager.getDeviceList().values()) {
if (Integer.toHexString(d.getVendorId()).equals(vid)) {
// Log.d(TAG, "USBDevices: Found Device VID: " + vid);
return d;
}
}
}
return null;
}
@Override
protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(usbReceiver, filter);
requestCamPerm(this);
requestStethPerm(this);
}
哦,顺便说一句,我没有在清单中提供任何额外的东西,例如vendorId等。
<uses-feature android:name="android.hardware.usb.host"/>
编辑*-终于明白了。
因此,就像每个人都提到的
android:directBootAware="true"
重启后仍然存在