当USB设备连接到Android平板电脑时,会出现一个弹出窗口,要求获得用户许可.我想压制这个,因为客户端不想要它.我该怎么办呢?
在代码中:
UsbManager.requestpermission();
Run Code Online (Sandbox Code Playgroud)
被调用以给USB设备临时访问.
这会弹出一个弹出窗口.默认情况下,如何禁止弹出窗口或授予用户访问权限?
Way*_*oda 89
当您在应用程序内部请求权限时,似乎"默认情况下使用此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>
Run Code Online (Sandbox Code Playgroud)
您还必须在xml资源中创建一个过滤器文件,例如res/xml/usb_device_filter:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device vendor-id="26214" product-id="26214" />
</resources>
Run Code Online (Sandbox Code Playgroud)
这里的vendor-id和product-id必须以十进制给出 - 在VID和PID之上都是0x6666.
我上面给出的也适用于USB配件(即配件是USB主机,而android是设备) - 在这种情况下,意图过滤器应该注册
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
Run Code Online (Sandbox Code Playgroud)
并且您还必须以完全相同的方式包含元数据过滤器.
请参阅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>
Run Code Online (Sandbox Code Playgroud)
(我的服务中有一个复杂的任务/流程布局,该区域的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();
}
}
Run Code Online (Sandbox Code Playgroud)
最后一块拼图,透明主题(我不确定,但你可以使用内置的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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
43588 次 |
| 最近记录: |