当前位置: 首页 > 知识库问答 >
问题:

USB 设备访问弹出窗口抑制?

寿元白
2023-03-14

当USB设备连接到Android平板电脑时,会出现一个弹出窗口,要求用户许可。我想抑制它,因为客户端不想要它。我应该怎么做?

在代码中:

UsbManager.requestpermission(); 

调用以授予 USB 设备临时访问权限。

这会弹出一个弹出窗口。默认情况下,如何禁止弹出窗口或授予用户访问权限?

共有2个答案

楚骞尧
2023-03-14

官方android文档称:

当用户连接与您的设备过滤器匹配的设备时,系统会向他们显示一个对话框,询问他们是否要启动您的应用程序。如果用户接受,您的应用程序将自动拥有访问设备的权限,直到设备断开连接。

如果您还选中要记住设备的复选框,则授予权限,直到应用程序卸载或通过应用程序管理器删除数据。

所以你必须这样做:

  1. 正如 Wayne 所说,添加意图过滤器(并删除主要活动中所有关于权限的内容)。
  2. 安装应用程序并关闭它。
  3. 拔下并插入您的 USB。
  4. 接受权限并选中复选框以记住设备。
李鸿
2023-03-14

当您在应用程序内请求权限时,似乎“默认用于此USB设备”复选框没有任何作用(我不确定为什么此复选框甚至显示在此弹出窗口中。

相反,您应该在清单中为您的活动注册一个意图处理程序:

<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/usb_device_filter" />  
</activity>

您还必须在xml资源中创建一个筛选器文件,例如res/xml/usb_device_filter:

<?xml version="1.0" encoding="utf-8"?>

<resources>
    <usb-device vendor-id="26214" product-id="26214" />
</resources>

此处的供应商 ID 和 product-id 必须以十进制形式给出 - VID 和 PID 以上均0x6666。

我上面给出的也适用于USB附件(即,附件是USB主机,android是设备)-在这种情况下,意向过滤器应该注册

<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />

您还必须以完全相同的方式包含元数据过滤器。

请参阅http://developer.android.com/guide/topics/connectivity/usb/accessory.html并搜索“使用意图过滤器”部分。

编辑

总之,如果您针对您的活动注册了意向过滤器,当连接USB设备/附件时,将立即显示USB许可窗口。如果用户选中“此USB设备默认使用”框,然后授予权限,这将被记住,权限对话框将不再显示(除非应用程序被卸载或用户从应用程序管理器中清除默认操作)。

我在这里放了一个微小、可怕的工作示例项目:

http://www.locusia.com/examples/permissionTest.zip

您需要编辑res/xml/usb_device_filter。xml,否则这将允许您快速测试它。

对于服务...

服务似乎无法接收USB意图。我通过制作一个隐藏的活动来绕过这个问题,然后这个活动会重新广播这个意图。

我在清单中这样定义它:

<activity
    android:name=".activities.UsbEventReceiverActivity"
    android:label="YOUR APPLICATION NAME - This appears in the permission popup"
    android:theme="@style/Theme.Transparent" 
    android:noHistory="true"
    android:excludeFromRecents="true"
    android:taskAffinity="com.example.taskAffinityUsbEventReceiver"
    android:process=":UsbEventReceiverActivityProcess"
    android:exported="false"
    android:directBootAware="true"        
    >    
    <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/usb_device_filter" />  
</activity>

(我的服务中有一个复杂的任务/流程布局,YMMV在该领域)。

您可能希望授予权限在重新启动期间保持。您需要android:directbootware=“true”以便在引导/重新引导后正确接收USB_DEVICE_ATTACHED

我像这样定义活动:

public class UsbEventReceiverActivity extends Activity
{   
    public static final String ACTION_USB_DEVICE_ATTACHED = "com.example.ACTION_USB_DEVICE_ATTACHED";
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    }
    
    @Override
    protected void onResume()
    {
        super.onResume();
        
        Intent intent = getIntent();
        if (intent != null)
        {
            if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED))
            {
                Parcelable usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                    
                // Create a new intent and put the usb device in as an extra
                Intent broadcastIntent = new Intent(ACTION_USB_DEVICE_ATTACHED);
                broadcastIntent.putExtra(UsbManager.EXTRA_DEVICE, usbDevice);
                    
                // Broadcast this event so we can receive it
                sendBroadcast(broadcastIntent);
            }
        }
        
        // Close the activity
        finish();
    }
}

最后一块拼图,透明主题(我不确定,但你可能会使用内置的Android半透明主题) - res/values/styles.xml:

<?xml version="1.0" encoding="utf-8"?>  
    <resources>  
    <style name="Theme.Transparent" parent="android:Theme">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:windowAnimationStyle">@null</item>
    </style>  
</resources>  
 类似资料:
  • 问题内容: 我想使用Firefox浏览器,使用RSelenium从网站下载文件。我正确地完成了所有操作(导航,选择正确的元素并写下我想要的内容);现在,我单击“下载”按钮,然后打开一个Firefox弹出窗口,并询问我是否要下载文件或“用…打开”。 不幸的是,由于隐私限制,我无法编写示例。 我的问题是:如何在需要时切换到弹出窗口/警报并单击“确定”? 我尝试了以下方法,但均未成功: 我也试过了 但是

  • Popup 是一种可以包含任何Html内容的弹出窗口,从App的主内容区域上弹出。 Popup 和其他所有的遮罩图层一样,是所谓的“临时视图”的一部分。 Popup 布局 Popup 布局相当简单. 你所需要做的就是将放到 body 里正确的位置上: <div class="modal modal-no-buttons"> ... <div class="popup"> An

  • 问题内容: 因此,我一直在用Qt为我的Python应用程序创建GUI。我现在遇到的情况是,按下按钮后,将执行适当的推迟操作,我们执行一些任务,然后需要打开一个单独的窗口,其中包含一两个东西。但是我似乎无法弄清楚如何创建这个新的单独窗口。谁能给我一个如何创建一个例子吗? 问题答案: 一个使您抓狂的常见错误是忘记将创建的弹出窗口的句柄存储在将保持活动状态的python变量中(例如,存储在主窗口的数据成

  • 问题内容: 我已经开始了angularjs项目,我想实现fancybox。 为此,我在解决方案中包含了jQuery和fancybox插件。我试图在下面的fancybox窗口中显示的代码中打开模板。 视图 控制者 还有 popup / add.html Fancybox成功打开了一个包含模板的窗口,但是该表达式尚未求值。谁能帮忙吗? 问题答案: 我已经为fancybox创建了指令

  • E/AndroidRuntime:致命异常:main process:com.luteraa.luteraaesports,pid:6355 java.lang.nullpointerException:试图在com.luteraa.luteraaesports.bgmicategoryAdapter.OpenDialog(bgmicategoryAdapter.java.access$000(b

  • 简介 USB 即 Universal Serial Bus 是一种支持热插拔的通用串行总线,在 USB 体系中又分为 USB Host 和 USB Device。本文将基于 stm32l475-atk-pandora 开发板,讲解基于 RT-Thread Studio 开发 USB Device 驱动。 USB Device 设备驱动的开发可总结为如下几个步骤: 新建 RT-Thread 完整版项