如何在允许访问USB设备之前停止Android请求许可


19

我有一个运行在ICS 4.0.3的无根Android平板电脑上的应用程序,该平板电脑通过USB主机模式接口控制USB设备。android.hardware.usb.host.xml文件位于/ system / etc / permissions中,并且一切正常。除了...

重新启动后第一次运行应用程序,然后插入USB设备时,我会弹出一个窗口,提示“允许应用程序APPNAME访问USB设备?[]默认用于此USB设备。取消,确定”,然后我必须先点击确定,然后才能开始使用该设备。

我需要关闭用户确认,以便该应用可以立即使用该设备。我该怎么做呢?对于使用按键生成器模拟用户点击屏幕上的按钮,我似乎有一些建议,但我希望避免这种方法并进行设置,以使确认请求根本不会发生。

我可能无法让供应商为我做一个定制的内核构建,但是我应该能够从他们那里获得固件签名密钥,这样我就可以将我的应用程序签名为系统应用程序,如果有帮助的话。

一个相关的问题:勾选“默认情况下对此USB设备使用”框似乎无济于事-如果我拔出并重新插入设备,则会再次收到确认提示。在这种情况下,我注意到每次拔出并重新插入(001、002、003等)时,/ dev / bus / usb / 001 /中的设备号都会更改,这也许可以解释此特定问题。


如果将应用程序部署到/ system / app,会发生什么?您可以在有和没有系统签名的情况下尝试使用。我将其写为评论是因为(a)我没有尝试过,以及(b)我不知道您是否可以使用此部署模型。
罗伯·普里汉姆

Answers:


10

这个问题和答案基本上是
/programming//a/15151075/588476的副本,
参见上面的链接以获取示例程序和更深入的讨论。

据我所知,有两种方法可以弹出USB权限框:

  1. 使用UsbManager.requestPermission(...)从您的应用程序显式请求权限
  2. 在附件上注册一个意图过滤器,并在连接设备后让系统请求许可

在1的情况下,我发现弹出窗口中记住该权限的复选框无效。

对我来说,我从软件中删除了与权限相关的所有代码,只需将intent-filter放入清单中即可。插入USB设备后,如果尚未授予其权限,则会弹出USB权限框。如果用户单击“确定”但未选中“记住”框,则下次连接设备时,该框将再次弹出。但是,如果用户选中该框并按OK,则该框不应再显示(除非先卸载软件,然后重新安装)。

我不确定是否存在与您的设备相关的错误,显示为/ dev / bus / usb / 001,然后显示002等-如果您使用的是Intent过滤器,请告诉我,否则“记住”复选框将显示没做什么。

我不知道您可以完全避免权限弹出窗口的任何方式。我怀疑没有像您所说的那样深入研究android代码是没有办法的。


1
你确定吗?拔出设备并重新连接后,我仍然看到许可请求。此行为与developer.android.com/guide/topics/connectivity/usb/host.html中的文档一致。“使用意图过滤器”部分显示“如果用户接受,则您的应用程序将自动拥有访问设备的权限,直到断开连接为止”
kbro

我只能为那些设备上的Nexus 7,Galaxy S3和Galaxy Note担保,我只需要接受一次许可(Android设备以主机模式运行)-只要我启用复选框以记住决定即可。您使用的是哪个设备/ Android版本,我感觉这是自定义/ OEM设备?
韦恩·浦田

这是一款基于WonderMedia WM8850-mid SOM的OEM 7英寸平板电脑,具有Android 4.0.3的风格。
kbro

意向过滤器仅适用于当前引导会话。是的,我将USB设备插入手机并自动授予权限
user924

7

除了我的评论,我还研究了底层的Android代码。

我有一个可能的答案,但有四个主要警告和障碍:

  1. 我没有尝试过,因为我没有适合的USB设备。
  2. 您需要新的权限
  3. 该权限要求您是系统应用
  4. 该代码需要访问公共API中未提供的内容

如果部署普通的售后应用程序,那就不用管了!

第一个前提条件是您拥有MANAGE_USB权限。在这里描述。

但是,相应的前提条件是您使用系统密钥签名,然后将应用程序安装到/ system / app中。

无论如何,如果您同意的话,下面是一些代码:

   IBinder b = ServiceManager.getService(USB_SERVICE);
   IUsbManager service = IUsbManager.Stub.asInterface(b);
   service.grantDevicePermission(mDevice, uid);

mDevice 是以前的设备。

uid是您自己的应用的UID,您可以进行查找。如何做到这一点的一个例子是这里的第一个答案。

都好?号ServiceManagerandroid.os.ServiceManager公共API,因此不是公共API。在此示例中,这就是您获得IUsbManager服务的方式(可能还有其他途径)。现在,解决这个问题超出了我的回答范围;在过去,您可以使用反射功能,但我不知道您是否仍然可以使用。

在所有这些恶作剧之后,看起来您不再需要请求权限,如果您这样做,它将立即返回而没有对话框。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.