学习USB状态监控的可以称之为纠结,以此三部曲。

第一曲:得来全不费工夫(Android新增加USB相关API)

一查,发现Android新增加了USB相关内容,如下图(双击图可放大):

Ok,我很喜欢读文档。要点:安装有安卓的设备(android-powered)连接usb,有两种状态,示意图见下(双击图可放大),文档传送门:http://developer.android.com/guide/topics/usb/index.html

文档的译文可以参考:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=115776

注意:此译文kiosks 翻译可能有误,应该翻译为终端

第一种:外设模式(accessory mode

eg:诊断设备 or 拔掉电连着电脑的手机(我想的例子)

从2.3.4可以使用,需要引入增加的库,且代码与标准API有一些差别

需要配置manifest文件

第二种:主机模式(host mode

从android3.1开始

eg:鼠标,u盘(android机顶盒等等)

当然,这些新增加的API中灰常好用。But,有木有,有木有,我们常用的主机模式,居然2.3.4不支持。好吧。只能用老方法。

第二曲:别有忧愁暗恨生(文档中查不到的问题)

监听USB的思路是,监听系统对于USB插拔发送的广播。通过广播监听,然后获取USB的状态。于是乎,在Intent中,查找Media相关的Action信息如下(双击图可放大):

于是manifest文件中注册(Register),过滤器中配置各种需要监听的Action,如下:(双击图可放大)

但是有木有啊,居然OnReceiver()方法中没有监听到。居然木有反应。后来有人告知缺少scheme=”file”,但是为什么?查看了文档,并未提及这点。理由是什么?有木有,歪什么?

第三曲:解铃还需系铃人(源码中找到答案)

文档既然没有明示,于是查看源码。搜索关键字“ACTION_MEDIA_BAD_REMOVAL”,得到结果,见下图:(双击图可放大)

显然系统发送此广播时,在前面加了“file://”, 因为发送时加了,当然过滤的时候必须加,否则过滤不到啊。

同样的,搜索关键字“ACTION_MEDIA_MOUNTED”,结果如下:(双击图可放大)

解决问题的方法很简单,注册信息中的Data项中的Scheme设置为file,代码如下:(双击图可放大)

既然这是个隐藏的问题,那么,让我们找找有木有其他的广播前面也加了scheme呢,搜索关键字“sendBroadcast”,结果无数,继续搜索“Uri.parse”,只有两条,即为“ACTION_MEDIA_MOUNTED”对应的选项。所以这个问题只是个例。

更多相关文章

  1. Android(安卓)MediaPlayer 常用方法介绍
  2. Android官方入门文档[1]创建一个Android项目
  3. Android读取Word文档
  4. [Android] ACTION_GET_CONTENT与ACTION_PICK的区别
  5. TabHost页卡
  6. Android(安卓)MediaPlayer 常用方法介绍
  7. Android电量和插拔电源状态广播监听
  8. Android(安卓)SDK自带教程之BluetoothChat
  9. android中传感器的学习

随机推荐

  1. Android柱状图-柱子分组
  2. Android动态加载so文件
  3. Android登录判断,并且在登录后跳转到相应
  4. Android Material Design 实践(六)--Mate
  5. ubuntu 安装 Android NDK
  6. Android 动态切换全屏和非全屏模式
  7. android Buton使用
  8. android:注册时的协议---》方法一:弹出框
  9. android 实现由下至上弹出并位于屏幕底部
  10. iOS vs. Android ICS: Hardware Accelera