USB设备访问popup抑制?

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

在代码中:

UsbManager.requestpermission(); 

被称为给USB设备临时访问。

这会抛出一个popup窗口。 如何禁止popup窗口或默认授予用户访问权限?

当你在你的应用程序中请求权限时,似乎默认使用这个USB设备的checkbox没有任何作用(我不知道为什么这个checkbox甚至出现在这个popup窗口中。

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

 <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资源中创build一个filter文件,例如res / xml / usb_device_filter:

 <?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是设备) – 在这种情况下,意图filter应该注册

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

而且还必须以完全相同的方式包含元数据filter。

请参阅http://developer.android.com/guide/topics/connectivity/usb/accessory.html并search“使用意图filter”部分。;

编辑

总而言之,如果您针对您的活动注册了意图filter,则在USB设备/配件连接时,USB许可窗口将立即显示。 如果用户选中“为此USB设备默认使用”框,然后授予权限,则会记住此权限,并且权限对话框将不会再次显示(除非应用程序已卸载或用户从应用程序pipe理器中清除默认操作)。

我已经把一个小小的,可怕的工作示例项目放在这里:

examples/permissionTest.zip

您将需要编辑res / xml / usb_device_filter.xml,否则这应该允许您快速地testing它。

对于服务…

似乎服务不能接收到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> 

(在我的服务中,我有一个复杂的任务/stream程布局,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>