首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否禁止USB设备访问弹出窗口?

问是否禁止USB设备访问弹出窗口?
EN

Stack Overflow用户
提问于 2012-09-12 19:54:19
回答 2查看 54.6K关注 0票数 46

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

在代码中:

代码语言:javascript
复制
UsbManager.requestpermission(); 

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

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

EN

回答 2

Stack Overflow用户

发布于 2013-03-01 13:22:49

当你在你的应用程序中请求许可时,似乎复选框"use default for this USB device“什么也不做(我不确定为什么这个复选框会出现在弹出窗口中。

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

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>

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

这里的供应商id和产品id必须以十进制给出-上面的VID和PID都是0x6666。

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

代码语言:javascript
复制
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />

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

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

编辑

总而言之,如果您针对您的活动注册了意图过滤器,则在连接USB设备/附件时将立即显示USB权限窗口。如果用户选中"use by default for this USB device“框,然后授予权限,则会记住这一点,并且不会再次显示权限对话框(除非卸载了应用程序或用户从应用程序管理器中清除了默认操作)。

我在这里放了一个小的,可怕的,工作的例子项目:

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

您需要编辑res/xml/usb_device_filter.xml,否则这将允许您非常快速地对其进行测试。

服务的...

服务似乎无法接收USB意图。我做了一个隐藏的活动,然后重新广播意图,从而绕过了这个问题。

我在我的清单中这样定义它:

代码语言:javascript
复制
<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"
    >    
    <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 )。

我这样定义了这个活动:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<?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>  
票数 99
EN

Stack Overflow用户

发布于 2019-05-08 07:05:28

虽然晚了,但我希望能帮上忙。官方android docs表示:“当用户连接一个与你的设备过滤器匹配的设备时,系统会向他们显示一个对话框,询问他们是否想要启动你的应用程序。如果用户接受,你的应用程序将自动获得访问该设备的权限,直到设备断开连接。”如果您还复选框以记住设备,则会授予权限,直到应用程序卸载或通过应用程序管理器删除数据为止。

所以你必须这样做:

在您的主activity).

  • Install应用程序中删除所有有关权限的内容,然后关闭IT.

  • Unplug并插入device.

  • Enjoy.

。

  • 接受权限并选中复选框以记住device.

  • Enjoy.

。请添加intent-filter as Wayne says,(并删除所有有关权限的内容,然后关闭IT.

  • Unplug并插入U盘
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12388914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档