USB设备访问弹出抑制?

时间:2012-09-12 11:54:19

标签: android usb

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

在代码中:

UsbManager.requestpermission(); 
调用

使USB设备临时访问。

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

2 个答案:

答案 0 :(得分:87)

当你在你的应用程序中请求权限时,似乎“默认使用此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>

这里的vendor-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并搜索“使用意图过滤器”部分。

修改

总而言之 - 如果您针对您的活动注册了intent-filter,则在连接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"
    >    
    <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)。

我定义了这样的活动:

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>  

答案 1 :(得分:0)

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

所以您必须这样做:

  1. 将意图过滤器添加为Wayne says,(并删除主要活动中所有有关权限的内容)。
  2. 安装应用并 关闭它
  3. 拔下插头并插入USB。
  4. 接受许可并选中复选框以记住设备。
  5. 享受。