如何授予USB权限,以便我的自助服务终端设备不会询问确认对话框?

时间:2017-09-13 13:10:49

标签: android android-6.0-marshmallow android-permissions android-source kiosk

我正在创建需要USB权限的自助服务终端应用程序。它将作为我们设备上的系统应用程序添加到AOSP图像中,并且是设备所有者应用程序。

应用程序通过USB在HOST模式下控制外部设备,因此默认情况下如何获得USB权限,以便用户无需每次关闭USB设备时都给予。平板电脑将关闭外壳,因此用户无法访问它控制的USB端口和设备。

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

可以使用this方法吗?

然后我发现了whitelisting设备的一些内容。 如果它可以成为可行的解决方案,明天就去尝试。

2 个答案:

答案 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"/>

编辑*-终于明白了。

因此,就像每个人都提到的

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

重启后仍然存在