您的位置:首页 > 移动开发 > Android开发

[学习记录]Android4.0耳机插入广播发送流程分析

2013-12-25 18:03 501 查看
                          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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: