gpt4 book ai didi

android - 如何授予 USB 权限,以便我的信息亭设备不询问确认对话框?

转载 作者:行者123 更新时间:2023-11-29 02:37:31 24 4
gpt4 key购买 nike

我正在创建需要 USB 权限的信息亭应用程序。它将作为我们设备上的系统应用程序及其设备所有者应用程序添加到 AOSP 镜像中。

应用程序在主机模式下通过 USB 控制外部设备,所以它如何默认获得 USB 权限,这样用户就不需要每次都给 USB 设备关闭电源。平板电脑将封闭外壳,因此用户无法访问它控制的 USB 端口和设备。

所以我希望某些 USB 设备默认受信任。如何实现?我如何绕过我的应用程序的 android usb 主机权限确认对话框。

可以this用的方法??

然后我发现了一些关于whitelisting的事情设备。如果它是可行的解决方案,明天将尝试。

最佳答案

回复

Managed to get intent-filter working. Problem is that when powering the tablet it will query from user permission to startup application. So i still get query once. Problem is that i have 2 USB devices and it gives permission to first one. – Jude

抱歉,我无法发表评论,但我看到的是请求权限 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);
}

哦,顺便说一句,我没有在 list 中提供任何额外的东西,比如 vendorId 等。只有一件事,

<uses-feature android:name="android.hardware.usb.host"/>

编辑* - 终于明白了。

所以就像大家提到的,

  1. 不要使用 USB 主机 API 调用 UsbManager.requestPermission()
  2. 通过资源下的 xml 创建您的设备过滤器,并将其添加到 list 中的元数据中。必须仅使用整数 ID,不能使用十六进制。
  3. 最后确保将此添加到您的 Activity 下
android:directBootAware="true"

重启后仍然存在

关于android - 如何授予 USB 权限,以便我的信息亭设备不询问确认对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46198519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com