[学习记录]Android4.0耳机插入广播发送流程分析
来源:互联网 发布:军事题材电视剧知乎 编辑:程序博客网 时间:2024/05/13 12:08
Android4.0耳机插入广播发送流程分析
1. 相关文件
a. frameworks/base/services/java/com/android/server/SystemServer.java
启动线程时新建WiredAccessoryObserver对象
b. framework/base/services/java/com/android/server/WiredAccessoryObserver.java
类WiredAccessoryObserver继承UeventObserver,处理耳机状态等
c. framework/base/core/java/android/os/UEventObserver.java
UEventObserver是Android Java层利用uevent获取Kernel层状态变化的机制
UEventObserver接收kernel的uevent信息的抽象类。
类UEventObserver提供了三个方法给子类来调用:
1、 onUEvent(UEvent> thr.setName("android.server.ServerThread");
thr.start();
}
}
init1 将会调用到> thr.setName("android.server.ServerThread");
thr.start();
下面来看下ServerThread中做了哪些操作
class ServerThread>private static final String uEventInfo[][] = {
{ "DEVPATH=/devices/virtual/switch/h2w","/sys/class/switch/h2w/state",
"/sys/class/switch/h2w/name"},
{ "DEVPATH=/devices/virtual/switch/usb_audio",
"/sys/class/switch/usb_audio/state",
"/sys/class/switch/usb_audio/name"},
{ "DEVPATH=/devices/virtual/switch/hdmi","/sys/class/switch/hdmi/state",
"/sys/class/switch/hdmi/name"}
};
public WiredAccessoryObserver(Context> ………
> startObserving(uEventInfo[i][0]);
}
}
}
在 WiredAccessoryObserver 的构造函数中注册开机完成广播,在BootCompletedReceiver接收器中循环检测数组uEventInfo,其中uEventInfo[0][0](即为DEVPATH=/devices/virtual/switch/h2w 为耳机设备路径),我们来看下函数>
UEventThread() {
> int len;
> if (len > 0) {
String> synchronized (mObservers) {
> // 找到匹配的match参数,说明某个observer的监听的event发生了
> ((UEventObserver)mObservers.get(i+1))
.onUEvent(new UEvent(bufferStr));
}
}
}
}
}
}
public> int state = Integer.parseInt(event.get("SWITCH_STATE"));
//此处调用> BIT_USB_HEADSET_DGTL)) |
((state == 1) ? BIT_HEADSET :
((state == 2) ? BIT_HEADSET_NO_MIC : 0)));
}
//此处调用> int newOrOld = headsetState | mHeadsetState;
> int usb_headset_anlg = headsetState & BIT_USB_HEADSET_ANLG;
>
> int h2w_state = (headsetState & (BIT_HEADSET | BIT_HEADSET_NO_MIC));
>
>
> Log.e(TAG, "unsetting h2w flag");
> }
> mPrevHeadsetState = mHeadsetState;
>
> Intent intent = new Intent(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
> } else {
// Insert> }
}
> @Override
> //for 循环有疑问
//> //int BIT_HEADSET_NO_MIC = (1 << 1);…
// BIT_USB_HEADSET_ANLG
// BIT_USB_HEADSET_DGTL
//>(BIT_HEADSET|
BIT_HEADSET_NO_MIC|
BIT_USB_HEADSET_ANLG|
BIT_USB_HEADSET_DGTL|
BIT_HDMI_AUDIO);
> if ((curHeadset & allHeadsets) != 0) {
> }
}
}
//此处填充 Intent , 并通过 ActivityManagerNative.broadcastStickyIntent来发送
private>
> if ((headsetState & headset) != 0) {
> }
>
// Pack> intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
//int> int microphone = 0;
> microphone = 1;
}
> "android.intent.action.HEADSET_PLUG";
/**
* Broadcast Action: An> "android.intent.action.USB_ANLG_HEADSET_PLUG";
/**
* Broadcast Action: A> "android.intent.action.USB_DGTL_HEADSET_PLUG";
参考资料:
http://blog.csdn.net/tanxs001/article/details/7709208
http://blog.sina.com.cn/s/blog_40d475e901012jxh.html
http://blog.csdn.net/darkengine/article/details/7442359
1. 相关文件
a. frameworks/base/services/java/com/android/server/SystemServer.java
启动线程时新建WiredAccessoryObserver对象
b. framework/base/services/java/com/android/server/WiredAccessoryObserver.java
类WiredAccessoryObserver继承UeventObserver,处理耳机状态等
c. framework/base/core/java/android/os/UEventObserver.java
UEventObserver是Android Java层利用uevent获取Kernel层状态变化的机制
UEventObserver接收kernel的uevent信息的抽象类。
类UEventObserver提供了三个方法给子类来调用:
1、 onUEvent(UEvent> thr.setName("android.server.ServerThread");
thr.start();
}
}
init1 将会调用到> thr.setName("android.server.ServerThread");
thr.start();
下面来看下ServerThread中做了哪些操作
class ServerThread>private static final String uEventInfo[][] = {
{ "DEVPATH=/devices/virtual/switch/h2w","/sys/class/switch/h2w/state",
"/sys/class/switch/h2w/name"},
{ "DEVPATH=/devices/virtual/switch/usb_audio",
"/sys/class/switch/usb_audio/state",
"/sys/class/switch/usb_audio/name"},
{ "DEVPATH=/devices/virtual/switch/hdmi","/sys/class/switch/hdmi/state",
"/sys/class/switch/hdmi/name"}
};
public WiredAccessoryObserver(Context> ………
> startObserving(uEventInfo[i][0]);
}
}
}
在 WiredAccessoryObserver 的构造函数中注册开机完成广播,在BootCompletedReceiver接收器中循环检测数组uEventInfo,其中uEventInfo[0][0](即为DEVPATH=/devices/virtual/switch/h2w 为耳机设备路径),我们来看下函数>
UEventThread() {
> int len;
> if (len > 0) {
String> synchronized (mObservers) {
> // 找到匹配的match参数,说明某个observer的监听的event发生了
> ((UEventObserver)mObservers.get(i+1))
.onUEvent(new UEvent(bufferStr));
}
}
}
}
}
}
public> int state = Integer.parseInt(event.get("SWITCH_STATE"));
//此处调用> BIT_USB_HEADSET_DGTL)) |
((state == 1) ? BIT_HEADSET :
((state == 2) ? BIT_HEADSET_NO_MIC : 0)));
}
//此处调用> int newOrOld = headsetState | mHeadsetState;
> int usb_headset_anlg = headsetState & BIT_USB_HEADSET_ANLG;
>
> int h2w_state = (headsetState & (BIT_HEADSET | BIT_HEADSET_NO_MIC));
>
>
> Log.e(TAG, "unsetting h2w flag");
> }
> mPrevHeadsetState = mHeadsetState;
>
> Intent intent = new Intent(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
> } else {
// Insert> }
}
> @Override
> //for 循环有疑问
//> //int BIT_HEADSET_NO_MIC = (1 << 1);…
// BIT_USB_HEADSET_ANLG
// BIT_USB_HEADSET_DGTL
//>(BIT_HEADSET|
BIT_HEADSET_NO_MIC|
BIT_USB_HEADSET_ANLG|
BIT_USB_HEADSET_DGTL|
BIT_HDMI_AUDIO);
> if ((curHeadset & allHeadsets) != 0) {
> }
}
}
//此处填充 Intent , 并通过 ActivityManagerNative.broadcastStickyIntent来发送
private>
> if ((headsetState & headset) != 0) {
> }
>
// Pack> intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
//int> int microphone = 0;
> microphone = 1;
}
> "android.intent.action.HEADSET_PLUG";
/**
* Broadcast Action: An> "android.intent.action.USB_ANLG_HEADSET_PLUG";
/**
* Broadcast Action: A> "android.intent.action.USB_DGTL_HEADSET_PLUG";
参考资料:
http://blog.csdn.net/tanxs001/article/details/7709208
http://blog.sina.com.cn/s/blog_40d475e901012jxh.html
http://blog.csdn.net/darkengine/article/details/7442359
0 0
- [学习记录]Android4.0耳机插入广播发送流程分析
- [学习记录]Android4.0耳机插入广播发送流程分析
- Android4.0耳机插入广播发送流程分析
- Android4.1.2 耳机插入拔出通知流程分析
- Android4.1.2 耳机插入拔出通知流程分析
- Android4.1.2 耳机插入拔出通知流程分析
- 耳机插入上层处理流程分析
- Android4.4蓝牙耳机HFP流程分析-1
- Android4.4蓝牙耳机HFP流程分析-2
- Android4.4蓝牙耳机HFP流程分析-3
- Android4.4蓝牙耳机HFP流程分析-3
- [学习记录]android 检测耳机是否插入
- Android4.4监听耳机插入处理方法
- 广播流程2--发送广播
- Android4.4 Framework分析——广播的注册(BroadcastReceiver)和发送(sendbroadcast)过程分析
- 基于N源码的广播注册和发送流程分析
- Android4.0源码Launcher启动流程分析
- Android4.0蓝牙打开流程分析
- delphi frame的使用
- 黑马程序员---------------------编写程序,该程序启动后用户可以按“yyyy-MM-dd”的格式输入一个日期, * 程序计算这一天是星期几,并且计算出是一年中的第几天
- 老朋友,歌曲停了很久很久,确实不错
- apple耳机与nokia耳机内部电路
- Quartz 标记一下
- [学习记录]Android4.0耳机插入广播发送流程分析
- postgresql hstore用法
- View工作原理(三)视图大小计算过程(measure过程)
- 从后台返回游戏的时候,新增弹出窗口的图片在android不加载(纹理变黑)的解决办法
- Java IO _压缩流
- UVA 656 - Optimal Programs(BFS)
- Array类的Sort()方法
- 黑马程序员_java多线程总结
- javascript目录