安卓USB设备权限和意图过滤器

8
我有一个与USB设备交互的Android应用程序,在Android开发者官方文档中关于获取与设备通信权限的部分中说:

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

Intent Filter应该在AndroidManifest.xml中声明,并使用包括vendor-id和product-id的资源文件。
如果我插入我的设备,即使已声明了Intent,也没有任何反应。 所以我必须使用同一官方文档中提到的显式请求权限的方法。
这样可以工作并且我可以与设备通信,但是每次启动应用程序或重新连接设备时,用户都必须授予权限。最终,这将向用户呈现消息,每次插入设备并启动应用程序时都要求确认,并且每次给出相同的权限是不可取的。
因此,如果“...自动接收权限...”部分不起作用。

我该如何使意图过滤器起作用?
我漏掉了什么吗?
我还有其他选择吗?


这个问题:Android USB权限对话框从未出现,与相反的问题相似,但解决方法对我无效。将应用程序设置为系统应用程序并绕过权限也不适用于我,如此处所述:通过Android中的服务打开USB附件权限
任何帮助都非常感激。
2个回答

8

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

这里的供应商ID和产品ID必须以十进制给出——上面的VID和PID都是0x0123。您可以查看USB设备访问弹出窗口抑制?

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

祝好, Samuel Reque samo_reque@hotmail.com


我会检查你的答案,但我已经有了device_filter xml文件。 - Anibaru
只有在第一次运行应用程序时,才会请求意图过滤器的权限,但不要求代码调用mManager.requestPermission(device, mPermissionIntent)是一个部分解决方案。 - Samuel Reque Zambrana
@SamuelReque:我已经在我的Broadcast Receiver类中拥有了这些清单权限,而不是在Activity中,但每次重新连接USB时仍然会弹出这些弹窗(选中复选框也没有用)。该怎么解决? - Basher51
@Basher51:请检查是否有调用mManager.requestPermission(device, mPermissionIntent)方法,这会导致弹出调用。 - Samuel Reque Zambrana
谢谢您指出问题所在。我已经实现了一个用于USB设备的工作Android应用程序,我正在尝试重用相同的代码用于另一个设备,但它不起作用。原来Android确实默认将“vendor-id”和“product-id”解析为十进制,但如果数字中有A-F字符,则会自动切换到十六进制。我的新设备恰好使用了仅由0-9字符组成的ID的十六进制表示法,因此这些数字被错误地解释为十进制。在ID前加上“0x”修复了这个问题。 - Foaly

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>

我在我的项目中确实有这个,但根据文档,这应该足以授予权限访问USB设备。但它不起作用,因此有了这个问题。 - Anibaru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接