【问题标题】:Android USB Device Permission and Intent FilterAndroid USB 设备权限和意图过滤器
【发布时间】:2013-03-06 18:48:32
【问题描述】:

我有一个将与 USB 设备交互的 Android 应用程序,在 Android developer official documentation for Obtaining permission to communicate with a device 中它说:

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

意图过滤器将在 AndroidManifest.xml 中声明,并使用包含供应商 ID 和产品 ID 的资源文件。

如果我插入我的设备,即使声明了 Intent,也不会发生任何事情。 所以我必须使用同一官方文档中提到的方法,其中涉及明确请求许可。

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

所以如果“...自动接收权限...”部分不起作用。

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


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


非常感谢任何帮助

【问题讨论】:

    标签: android intentfilter android-permissions usb


    【解决方案1】:

    我也有同样的问题,在你的 AndroidManifest.xml 中使用 Device 的 Activity 中这样写:

    <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 device access pop-up supression?

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

    问候, 塞缪尔·雷克 samo_reque@hotmail.com

    【讨论】:

    • 我会检查你的答案,但我已经有了 device_filter xml
    • 只有在第一次运行应用时才请求intent-filter的权限,但不需要代​​码调用mManager.requestPermission(device, mPermissionIntent)是部分解决方案。
    • @SamuelReque:我在我的广播接收器类而不是活动下拥有那些清单权限,但是每次我重新连接 USB 时我仍然会得到这些弹出窗口(选中复选框也没有用)。该怎么办?
    • @Basher51: 检查没有调用方法 mManager.requestPermission (device, mPermissionIntent) 这导致调用弹出
    • 感谢您指出问题的方向。我已经为 USB 设备实现了一个工作的 android 应用程序,我试图为另一个设备重用相同的代码,但它不起作用。事实证明,Android 确实默认将“vendor-id”和“product-id”解析为十进制,但如果数字中有 A-F 字符,则会自动切换为十六进制。我的新设备碰巧使用了十六进制表示中只有 0-9 个字符的 ID,因此这些数字被误解为十进制。为 ID 添加前缀“0x”解决了这个问题。
    【解决方案2】:

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

    <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 设备的权限。但它不起作用,因此问题。
    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2023-03-16
    相关资源
    最近更新 更多