Android USB设备权限和意图过滤器

时间:2013-03-06 18:48:32

标签: android intentfilter android-permissions usb

我有一个可以与USB设备互动的Android应用,在Android developer official documentation for Obtaining permission to communicate with a device中说:

  

注意:如果您的应用程序使用意图过滤器来发现连接时的USB设备,则在用户允许您的应用程序处理意图时,它会自动获得许可。如果没有,您必须在连接到设备之前在应用程序中明确请求权限。

Intent Filter将在AndroidManifest.xml中声明,并使用包含vendor-id和product-id的资源文件。

如果我插入我的设备没有任何反应,即使使用声明的Intent。 因此,我必须使用相同官方文档中提到的方法,该方法涉及明确要求许可。

这可行,我可以与设备通信,但是每次启动应用程序或重新连接设备时,用户都必须提供权限。最后,这将向用户显示一条消息,要求每次插入设备并启动应用程序时进行确认,并且每次都不需要提供相同的权限。

因此,如果“...自动获得许可......”部分无效。

如何让intent过滤器工作?
我错过了什么?
我还有其他选择吗?


这个问题:Android USB Permissions Dialog never appears有相反的问题,但解决方案对我不起作用。如下所示,使应用程序成为系统应用程序并绕过权限对我来说不起作用:USB open accessory permissions through a service in android


非常感谢任何帮助

2 个答案:

答案 0 :(得分:4)

我有同样的问题,在使用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>

这里的vendor-id和product-id必须以十进制形式给出 - 在VID和PID之上都是0x0123。你看到USB device access pop-up supression?

你不能调用mManager.requestPermission(device,mPermissionIntent),所以你必须直接调用mManager.openDevice(mDevice);并且您可以正常通信而无需出现权限弹出消息。

此致 塞缪尔雷克 samo_reque@hotmail.com

答案 1 :(得分:0)

我不太了解你的问题,但我认为解决方案是这样的......

<activity ...>
<intent-filter >
            <action android:name="android.intent.action.MAIN" />                
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
            <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter"/>
            <category android:name="android.intent.category.HOME" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>