47

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

在代码中:

UsbManager.requestpermission(); 

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

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

4

2 回答 2

102

当您在应用程序中请求权限时,“默认情况下用于此 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 和产品 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"
    >    
    <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>  
于 2013-03-01T05:22:48.547 回答
0

官方android 文档说:

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

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

所以你必须这样做:

  1. 正如韦恩所说,添加意图过滤器,(并删除您主要活动中的所有权限)。
  2. 安装应用程序并关闭它
  3. 拔下并插入您的 USB。
  4. 接受许可并选中复选框以记住设备。
于 2019-05-07T23:05:27.947 回答