【问题标题】:USB_DEVICE_ATTACHED only startsActivity of Galaxy S3 ICSUSB_DEVICE_ATTACHED 仅启动 Galaxy S3 ICS 的活动
【发布时间】:2012-06-28 10:31:57
【问题描述】:

最近我一直在尝试根据我见过的所有示例和示例使用广播接收器接收意图 android.hardware.usb.action.USB_DEVICE_ATTACHED。

我已经在清单中声明了一个接收者;

<receiver android:name=".UsbDeviceReceiver">
        <intent-filter>
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
    <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
                android:resource="@xml/device_filter"/>

我在活动代码中也做了类似的操作 - onStart 和 OnStop 注册/注销接收器。

    IntentFilter filter = new IntentFilter();
    filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);

    registerReceiver(mUsbReceiver, filter);

但是,我发现意图被抓住了。观察 logcat 我可以看到附加 USB 设备会寻找要启动的活动,而分离则广播分离意图。根据上述样本,情况并非如此。

我是否遗漏了有关元数据的一些重大问题?我对 android.hardware.usb.action.USB_DEVICE_DETACHED 没有任何问题。也许这是安装在galaxy s3上的android版本的错误?也许这是 ICS 的“功能”。

欢迎提供任何相关信息!

【问题讨论】:

  • 代码(参见示例)github.com/android/platform_frameworks_base/blob/master/… 不会在设备附件上发送广播,它只会启动专门注册以处理该设备的活动。有人在 gerrit 上提交了一个补丁来发送广播,但由于与设计理念不匹配,它似乎被拒绝了。
  • 嗨,克里斯,感谢您的简洁回复。令人欣慰的是,这不仅仅是我的设备的问题。补丁提交是否仍然存在,以便我可以更详细地阅读此行为的原因?我目前的解决方法将涉及一个无形的活动和我自己的广播。感觉就像一个黑客。完成后我会发布代码。

标签: android usb


【解决方案1】:

这是一个已知的缺陷:

http://code.google.com/p/android/issues/detail?id=25701

这里:

http://code.google.com/p/android/issues/detail?id=25703

但不要屏住呼吸等待它修复。当您查看错误报告时,请给它加星标,以便您收到报告更新的通知。可能是其他人要求修复的 cmets。

【讨论】:

  • 感谢戴夫的链接。我已经让自己不得不解决问题。我安排了一项常规任务以在活动恢复时观察 USB。我不喜欢这样做,它可能不适合电池,但它工作得非常愉快。
【解决方案2】:

我为USB_ACCESSORY_ATTACHED 找到的解决方法是只使用一个按钮来再次调用我的OpenAccessory(accessory) 方法,这似乎对我有用。也许这也适用于USB_DEVICE_ATTACHED。只需在某处设置设备已连接/未连接状态,如果未连接,用户只需点击该按钮即可。

编辑:我发现将android:launchMode="singleTask" 放入清单中似乎“注册”了USB_ACCESSORY_ATTACHED 的意图,尽管它从未如此显示它确实像它正在做的那样工作。

【讨论】:

    【解决方案3】:

    您可以在清单中声明意图过滤器,如下所述:http://developer.android.com/guide/topics/connectivity/usb/host.html

    然后你在 onResume() 中捕获 android.hardware.usb.action.USB_DEVICE_ATTACHED 或在 onNewIntent() 中。

    当您的活动正在运行并附加您的 USB 设备时,主要意图被抛出到 onResume(),但 android.hardware.usb.action.USB_DEVICE_ATTACHED 到 onNewIntent()。据此调整您的代码。

    你可以按如下方式声明 onNewIntent():

    @Override
        protected void onNewIntent(Intent intent) 
        {
            super.onNewIntent(intent);
            System.out.println("onNewIntent" + intent.getAction());
            if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(intent.getAction())) {
            mDevice = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
            if(mDevice!= null)
                mUsbManager.requestPermission(mDevice, mPermissionIntent);
            }
        }
    

    和 onResume() 类似。

    在安卓 4.0.4 上测试 设备:三星 Galaxy Tab 750

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-30
      • 1970-01-01
      • 2012-11-08
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多