s0mic923耳机品牌

苹果耳机控制不了手机怎么回事啊_百度知道
苹果耳机控制不了手机怎么回事啊
1.耳机的标准要是与手机不兼容,线控及麦克风功能会无法使用。2.耳机分为两种标准:OMTP标准通常被叫做国家标准,CTIA被称为国际标准。两者的区别在于插头最后两节GND和MIC顺序相反。CTIA耳机是兼容OMTP设备的。CTIA耳机插入OMTP设备会造成声音小且失真,按下MIC键后声音恢复。由此可鉴定出设备是OMTP标准的,而耳机是CTIA标准。3.OMTP是带MIC的耳机3.5mm接口标准,通常称为国家标准,国家所用。插针接法是(从小头算起):左声道-右声道-麦克风-地线。4.还有一种带MIC的耳机3.5mm接口是国际标准,称为CTIA,插针接法是:左声道-右声道-地线-麦克风。
其他类似问题
为您推荐:
是不是原装耳机那,如果不是就无法控制的,建议更换一下原装耳机
不是原装耳机吧?是不是高仿的?
苹果的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁耳机mic的直流电阻一般是多少? 手机用的那种。_百度知道
耳机mic的直流电阻一般是多少? 手机用的那种。
提问者采纳
用万用表测出的是你要的直流电阻吗
嗯。就是那个。用万用表测出来的。不过一般的直流阻抗是直接在耳机插头的MIC和GND两端接就行吗
不行的,你要测的是话筒MIC,怎么接耳机的两头呢?
不知道追问完了能不能采纳为最佳答案了。。我测的就是mic那节和地那节,1K欧姆左右吧。
其他类似问题
为您推荐:
其他2条回答
直流似乎测不出来电阻值,只对交流有阻抗。
阻抗就是指耳机本身的的电阻大小,单位是欧姆(Ω)。抗阻越小,耳机越容易驱动,抗阻越大,则越不易驱动。一般的随身听耳机抗阻为16Ω-64Ω。一般耳机阻抗在低频最大,因此对低频的衰减要小于高频的;对大多数耳机而言,增大输出阻抗会使声音更暗更混(此时功放
对耳机驱动单元的控制也会变弱),但某些耳机却需要在高阻抗下才更好听。抗组太大耳机的声音就会听起来有些混,而对于各种便携式随身听,例如CD、MD或MP3,一般会使用低阻抗耳机(通常都在50欧姆以下),这是因为这些低阻抗耳机比较容易驱动,同时还要注意灵敏度要高,对随身听、MP3、MP4、CD来说灵敏度指标更加重要。当然,阻抗越高的耳机搭配输出功率大的音源时声音效果更好。   耳机阻抗的大小和耳...
您可能关注的推广
直流电阻的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁当前位置:
共找到343件符合【MIC耳机】的产品
移动版:MIC耳机
Hi,欢迎来到慧聪
产品微门户
·入驻商家30万家
·品牌50万个
·商铺5000万种
高达数千万的至尊企业网站
每天1000万次企业采购搜索
价格:& 0.37/PCS
价格:& 10/副
价格:& 8.8/条
价格:& 20/副
价格:& 5/台
价格:& 面议
价格:& 3.5/条
价格:& 3.5/副
价格:& 3.4/条
MIC耳机最新加入
1批发手机扁线耳机 带MIC耳机 万能耳机 免提耳机 CLH-
2实力深圳OEM工厂 可设计花色 创意手机带MIC耳机
3S708 MIC耳机 深圳厂家
4优质全指向驻极体插针电容咪头4015P咪头双电容MIC耳机平
& 0.29 /PCS
5实力深圳耳机工厂批发入耳式MP3手机耳机 MIC耳机 立体声
6新款个性入耳式线控 彩色面条盒装 非主流手机带MIC耳机 I
7生产金属手机耳机|免提耳机|带MIC耳机|线控耳机
8索尼SONY原装无线麦克风ECM-AW3摄像机/录音笔用 MIC耳机专用口
& 1500 /个
9新款热销 苹果耳机 IPHONE5线控带MIC耳机 IPHO
10金属带麦耳机 弯头带麦耳机 MIC耳机 苹果耳机
& 38.5 /副
MIC耳机优质产品
& 0.55 /pcs
商家等级:
经营模式:
政府及其他
所在地址:广东省
& 1.55 /PCS
商家等级:
经营模式:
政府及其他
所在地址:广东省
商家等级:
经营模式:
政府及其他
所在地址:广东省
商家等级:
经营模式:
政府及其他
所在地址:广东省
商家等级:
经营模式:
政府及其他
所在地址:广东省
MIC耳机最新产品
认证类型:产品认证
材质:铝壳|规格尺寸:4.0*1.2|声道数:多声道|种类:背极式带针麦克风
耳机类型:其它|插头类型:其它|是否无线耳机:其它|耳机输出音源:其它
耳机类型:耳塞式|插头类型:直插型|是否无线耳机:有线耳机|耳机输出音源:通讯设备
MIC耳机相关资讯
加入慧聪,做世界人的生意>>
您还可能感兴趣的产品:
您还可能感兴趣的厂家:
您还可能感兴趣的图片:
您还可能感兴趣的价格:
您还可能感兴趣的商品:
慧聪网为您提供的MIC耳机最新供应商、经销商、厂家,包括MIC耳机的参数、型号、图片、价格等信息,为您提供全面的MIC耳机参考信息和在线洽谈的机会,找MIC耳机供应信息尽在慧聪网。
按字母分类 :
版权所有 慧聪网
通用网址:hc360
互联网药品信息服务资格证书:(京)-经营性- 海淀公安局网络备案编号:
Copyright?2000-. All Rights Reserved4375人阅读
Android(1)
作者同类文章X
linux(24)
作者同类文章X
Android4.2耳机插拔检测实现方法&
1.&耳机检测的硬件原理
一般的耳机检测包含普通的耳机检测和带的耳机检测两种,这两种耳机统称为,而对于不带的耳机,一般称之为。
对于装置的插入检测,一般通过即耳机插座来完成,大致的原理是使用带检测机械结构的耳机插座,将检测脚连到可中断上,当耳机插入时,耳机插头的金属会碰到检测脚,使得检测脚的电平产生变化,从而引起中断。这样就可以在中断处理函数中读取的的值,进一步判断出耳机是插入还是拔出。
而对于是否带的检测,需要通过附加的电流的功能。
Android耳机插拔可以有两个机制实现:
1.&InputEvent
其中是系统默认的耳机插拔机制,所以这里代码是基于实现的,对于机制只是大概看了看,并没有具体实现。
1.1&两种机制的切换
Android默认提供了两种解决方法,那么一定也提供了两种方式的切换,这个提供切换的设置名为(&When&true&use&the&linux&/dev/input/event&subsystem&to&detect&the&switch&changes&on&the&headphone/microphone&jack.&When&false&use&the&older&uevent&framework),对源代码进行全局搜索,可以看到它在中,默认为,即不使用方式,另外在包的厂商相关的文件夹中也找到了相关的设置,如下:
/android/4.2/device/asus/flo/overlay/frameworks/base/core/res/res/values/config.xml
/android/4.2/device/samsung/manta/overlay/frameworks/base/core/res/res/values/config.xml
可以看到有些厂商的确是使用了的方式来进行耳机检测。具体对这个变量的修改是在下还是下我想应该都可以,下可能更好。violet源码device/mstar/mstarnike/overlay/frameworks/base/core/res/res/values/config.xml&中,没有对config_useDevInputEventForAudioJack&设置。
1.2&Android耳机插拨检测流程
2&InputEvent
2.1&Framework层对InputEvent的处理机制
InputEvent的处理主要在
InputManagerService.java中。在构造函数中,通过如下函数,
mUseDevInputEventForAudioJack&=&context.getResources().
&&&&&&&&&&&&&&&&&&&&&&&&&&getBoolean(R.bool.config_useDevInputEventForAudioJack);
判断当前是否通过实现耳机插拔检测。
当得到后,会调用中的函数,进而转至文件中的函数,之后的流程就和相同了,在后续会讲到。
2.2&Kernel层的处理机制
Kernel层对耳机插拔处理主要是通过()来实现,而在实际使用中,已经为我们封装好了相应接口函数,只要符合规范就可以拿来使用。下面列出几个常用的接口函数()。
int&snd_soc_jack_new(structsnd_soc_codec&*codec,&
&&&&&&&&&&&&&&const&char&*id,&int&type,&struct&snd_soc_jack&*jack)
生成一个新的对象,定义其被检测的类型,即可能插入的设备类型。一般定义为,其余也可以根据接口支持种类添加,等。
这个函数中调用了,而在中可以看到调用&分配了,就可以在后续产生了。
int&snd_soc_jack_add_pins(structsnd_soc_jack&*jack,&int&count,&struct&snd_soc_jack_pin&*pins)
将之前定义好的加入中,方便统一管理。这一步和没有一定联系,可以不调用,主要是可以将耳机插座定义为加入进行省电管理。
viod&snd_soc_jack_report(structsnd_soc_jack&*jack,&int&status,&int&mask)
汇报插拔状态,主要完成以下两个工作:
&a)&根据插入拔出状态更新前面通过加入的的状态,对其进行上电下电管理。
b)&调用,在其中通过来向上层汇报。
基于上面的函数,可以用以下做法来实现基于机制的耳机插拔检测:
a)&snd_soc_jack_new&创建对象
b)&snd_soc_jack_add_pins将其加入到中
c)&通过申请耳机插拔中断,在中断处理函数中通过检测线高低电平判断耳机是插入还是拔出,通过读取寄存器来判断是还是
d)&根据判断结果调用发送
此外,还提供了一个封装好的函数来实现上述和步骤的功能:
int&snd_soc_jack_add_gpios(struct&snd_soc_jack&*jack,&int&count,&
&&&&&&&&&&&&&&&&&&&&&&&&struct&snd_soc_jack_gpio&*gpios)
该函数通过标准驱动申请及对应中断,并提供了统一的中断处理函数来汇报事件。此函数只适用于耳机中断接至且驱动为标准驱动的情况下,并且不支持检测。
3.1&Switch&基本原理
Switch是引进的新的驱动,目的是用于检测一些开关量,比如检测耳机插入、检测设备插入等。在文件系统中创建相应,用户可以通过与之交互;此外还可以通过机制与之交互,从而检测状态。
3.1.1&Switch的实现
Switch&class在中实现为一个,可动态加载;而具体的则是基于框架。代码在和中。其中实现了一个,而则是这个中的一个,即针对的一个设备。
switch_class.c文件创建了一个,实现了内核的机制,提供支持函数供其他驱动调用。
static&int&__init&switch_class_init(void){&&&&&&&
return&create_switch_class();&}&&
static&void&__exit&switch_class_exit(void){
&&&&&&&class_destroy(switch_class);&}&&
module_init(switch_class_init);&
module_exit(switch_class_exit);
init函数调用创建设备类。相对应则是销毁这个设备类。
该文件导出两个函数供其他设备驱动调用,分别是注册设备和注销()。
int&switch_dev_register(struct&switch_dev&*sdev)
&&&&&&&&int&
&&&&&&&&if&(!switch_class)&{
&&&&&&&&&&&&&&&&ret&=&create_switch_class();
&&&&&&&&&&&&&&&&if&(ret&&&0)
&&&&&&&&&&&&&&&&&&&&&&&&return&
&&&&&&&&sdev-&index&=&atomic_inc_return(&device_count);
&&&&&&&&sdev-&dev&=&device_create(switch_class,&NULL,
&&&&&&&&&&&&&&&&MKDEV(0,&sdev-&index),&NULL,&sdev-&name);
&&&&&&&&if&(IS_ERR(sdev-&dev))
&&&&&&&&&&&&&&&&return&PTR_ERR(sdev-&dev);
&&&&&&&&ret&=&device_create_file(sdev-&dev,&&dev_attr_state);
&&&&&&&&if&(ret&&&0)
&&&&&&&&&&&&&&&&goto&err_create_file_1;
&&&&&&&&ret&=&device_create_file(sdev-&dev,&&dev_attr_name);
&&&&&&&&if&(ret&&&0)
&&&&&&&&&&&&&&&&goto&err_create_file_2;
&&&&&&&&dev_set_drvdata(sdev-&dev,&sdev);
&&&&&&&&sdev-&state&=&0;
&&&&&&&&return&0;
err_create_file_2:
&&&&&&&&device_remove_file(sdev-&dev,&&dev_attr_state);
err_create_file_1:
&&&&&&&&device_destroy(switch_class,&MKDEV(0,&sdev-&index));
&&&&&&&&printk(KERN_ERR&&switch:&Failed&to&register&driver&%s\n&,&sdev-&name);
&&&&&&&&return&
EXPORT_SYMBOL_GPL(switch_dev_register);
void&switch_dev_unregister(struct&switch_dev&*sdev)
&&&&&&&&device_remove_file(sdev-&dev,&&dev_attr_name);
&&&&&&&&device_remove_file(sdev-&dev,&&dev_attr_state);
&&&&&&&&dev_set_drvdata(sdev-&dev,&NULL);
&&&&&&&&device_destroy(switch_class,&MKDEV(0,&sdev-&index));
EXPORT_SYMBOL_GPL(switch_dev_unregister);
然后是两个操作函数和,分别用于输出的和。当用户读取中对应的(和)时候,系统会自动调用这两个函数向用户返回设备的名称和状态。
static&ssize_t&state_show(struct&device&*dev,&struct&device_attribute&*attr,&char&*buf)
&&&&&&&&struct&switch_dev&*sdev&=&(struct&switch_dev&*)dev_get_drvdata(dev);
&&&&&&&&if&(sdev-&print_state)&{
&&&&&&&&&&&&&&&&int&ret&=&sdev-&print_state(sdev,&buf);
&&&&&&&&&&&&&&&&if&(ret&&=&0)
&&&&&&&&&&&&&&&&&&&&&&&&return&
&&&&&&&&return&sprintf(buf,&&%d\n&,&sdev-&state);
static&ssize_t&name_show(struct&device&*dev,&struct&device_attribute&*attr,
&&&&&&&&&&&&&&&&char&*buf)
&&&&&&&&struct&switch_dev&*sdev&=&(struct&switch_dev&*)dev_get_drvdata(dev);
&&&&&&&&if&(sdev-&print_name)&{
&&&&&&&&&&&&&&&&int&ret&=&sdev-&print_name(sdev,&buf);
&&&&&&&&&&&&&&&&if&(ret&&=&0)
&&&&&&&&&&&&&&&&&&&&&&&&return&
&&&&&&&&return&sprintf(buf,&&%s\n&,&sdev-&name);
可见,这两个函数就是直接调用对应的中的和函数;如果没有定义这两个函数,则调用把信息打印到缓冲区里。
最后是函数,该函数是内核内部使用,并不为用户调用,它完成的功能主要是两件事:调用和输出设备名称和状态至文件系统;发送通知用户的信息名称和状态。
switch_gpio.c文件基于实现了一个的设备驱动,其实现的原理如下:基于框架,在函数中完成初始化,包括获取的使用权限,设置方向为输入,注册设备,为分配中断,指定中断服务程序,初始化一个工作,最后读取初始状态。
当引脚状态发生变化时,则会触发中断,在中断服务程序中调用,这个被的即前面初始化的,最后这个被执行,在函数中读取当前电平,调用更新并通过通知上层应用。
这个设备驱动只实现了函数:,没有实现函数。当执行的时候,里面调用输出状态到。
3.1.2&Switch模块的用户接口
sysfs文件为,,环境变量为,。文件系统和机制。
UEvent机制比较简单,它基于,会在建立耳机插拔的目录,在此目录下有个设备结点名为,通过更新的值,从而通知上层耳机状态的改变。
3.2&Framework层对UEvent的处理机制
Android在&java中实现针对的机制。
在这个文件中,从中继承了类,在中将要观察的事件加入到中:
if(!mUseDevInputEventForAudioJack)&
uei&=&new&UEventInfo(NAME_H2W,BIT_HEADSET,&BIT_HEADSET_NO_MIC);
可以看到,只有当不使用时才添加事件,就是对应的的名字。和是结点的两个值,分别表示有和无的耳机。
当事件到来时,类中重载的函数会被回调,从而调用,其中的值就是通过结点来获得。
最后,程序会进入函数中处理,在中根据的值设置,然后调用,最后进入。
3.3&Kernel层的机制
前面说过,基于的耳机检测机制需要实现一只&driver,它会建立一个用于耳机插拔检测的目录,在此目录下有个设备结点名为,通过更新的值,从而通知上层耳机状态的改变。
switch&driver的目录在&kernel的目录下,可以从目录名称中看到这只是为了专门产生的。在目录下有两个已有文件,是的内部实现,它提供了所需的一些;是一个例子,它实现了一个基于中断的。
另外,在目录下也有同样的文件,不同之处是两者在下生成的结点的位置不同,如果要按照目录下的来实现,需要更改文件。
下面讲讲如何添加。添加很简单,可以仿照,大致步骤如下:
&a)&在目录下新建一个,其中包含一个全局变量,即要注册的。
b)&在的函数中调用switch_dev_register将前面的注册到系统中。
c)&申请用于耳机检测的中断处理函数。对于耳机插拔来说,由于用户的插拔快慢等可能产生多次中断,所以一般是在中断处理函数中实现一个延时工作队列,即,在队列的回调函数中来进行实际判断。
d)&当中断发生后,通过switch_set_state设置节点的值,这个值要和文件中定义的一致,可参看和的定义。目前是表示无耳机插入,表示带的耳机,表示不带的耳机。这个函数调用了,这两个函数就是通过来通知的核心函数了。
3.4&基于的
&&&&System&Server是系统的核心,他在虚拟机启动后立即开始初始化和运行。其它的系统服务在进程的环境中运行。
&&&&在函数中,首先检查系统时间设置和。然后加载一个叫的本地库,他提供本地方法的接口(源程序在目录中)。然后调用本地方法设置服务。然后执行一个死循环线程,该线程中启动了很多服务。
&&&public&static&void&main(String[]&args)&{
&&&&&&&&...&...
&&&&&&&&Environment.setUserRequired(true);
&&&&&&&&System.loadLibrary(&android_servers&);
&&&&&&&&Slog.i(TAG,&&Entered&the&Android&system&server!&);
&&&&&&&&//&Initialize&native&services.
&&&&&&&&nativeInit();
&&&&&&&&//&This&used&to&be&its&own&separate&thread,&but&now&it&is
&&&&&&&&//&just&the&loop&we&run&on&the&main&thread.
&&&&&&&&ServerThread&thr&=&new&ServerThread();
&&&&&&&&thr.initAndLoop();
在中启动了监听有线耳机接入的服务。
&&&&&&&&&&&&if&(!disableMedia)&{
&&&&&&&&&&&&&&&&try&{
&&&&&&&&&&&&&&&&&&&&Slog.i(TAG,&&Wired&Accessory&Manager&);
&&&&&&&&&&&&&&&&&&&&//&Listen&for&wired&headset&changes
&&&&&&&&&&&&&&&&&&&&inputManager.setWiredAccessoryCallbacks(
&&&&&&&&&&&&&&&&&&&&&&&&&&&&new&WiredAccessoryManager(context,&inputManager));
&&&&&&&&&&&&&&&&}&catch&(Throwable&e)&{
&&&&&&&&&&&&&&&&&&&&reportWtf(&starting&WiredAccessoryManager&,&e);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
WiredAccessoryManager中使用了两种方式监听耳机的状态
在构造函数中获得的状态,配置为。
public&WiredAccessoryManager(Context&context,&InputManagerService&inputManager)&{
&&PowerManager&pm&=&(PowerManager)context.getSystemService(Context.POWER_SERVICE);
&&mWakeLock&=&pm.newWakeLock(
&&&&&&&&&&&&&&PowerManager.PARTIAL_WAKE_LOCK,&&WiredAccessoryManager&);
&&&&&&&&mWakeLock.setReferenceCounted(false);
&&&&&&&&mAudioManager&=&(AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
&&&&&&&&mInputManager&=&inputM
&&&&&&&&mContext=&&&
&&&&&&&&mUseDevInputEventForAudioJack&=
&&&&&&&&&&&context.getResources().getBoolean(R.bool.config_useDevInputEventForAudioJack);
&&&&&&&&mObserver&=&new&WiredAccessoryObserver();
&&&&&&&&context.registerReceiver(new&BroadcastReceiver()&{
&&&&&&&&&&&&&&&&&&&&@Override
&&&&&&&&&&&&&&&&&&&&public&void&onReceive(Context&ctx,&Intent&intent)&{
&&&&&&&&&&&&&&&&&&&&&&&&bootCompleted();
&&&&&&&&&&&&&&&&&&&&}&&&
&&&&&&&&&&&&&&&&},&&
&&&&&&&&&&&&&&&&new&IntentFilter(Intent.ACTION_BOOT_COMPLETED),&null,&null);
在启动完成后就开启监听,注册了开机广播,开机后,会开始所有相关的,并且开始监听。在中
private&void&bootCompleted()&{
if&(mUseDevInputEventForAudioJack)&{
int&switchValues&=&0;
if&(mInputManager.getSwitchState(-1,&
InputDevice.SOURCE_ANY,&SW_HEADPHONE_INSERT)&==&1)&{
switchValues&|=&SW_HEADPHONE_INSERT_BIT;
&&&&&&&&&&&&}
if&(mInputManager.getSwitchState(-1,&
&&&&&&&&&&&InputDevice.SOURCE_ANY,&SW_MICROPHONE_INSERT)&==&1)&{
switchValues&|=&SW_MICROPHONE_INSERT_BIT;
&&&&&&&&&&&&}
notifyWiredAccessoryChanged(0,&switchValues,
&&&&&&&&&&&&&&&&&&&&SW_HEADPHONE_INSERT_BIT&|&SW_MICROPHONE_INSERT_BIT);
mObserver.init();
在中实例化了一个,其就是通过方式来检测耳机的插入拔出状态,
&mObserver&=&new&WiredAccessoryObserver();
class&WiredAccessoryObserver&extends&UEventObserver&{
private&final&List&UEventInfo&&mUEventI
public&WiredAccessoryObserver()&{
mUEventInfo&=&makeObservedUEventList();
private&List&UEventInfo&&makeObservedUEventList()&{
List&UEventInfo&&retVal&=&new&ArrayList&UEventInfo&();
UEventInfo&
//&Monitor&h2w
if&(!mUseDevInputEventForAudioJack)&{
uei&=&new&UEventInfo(NAME_H2W,&BIT_HEADSET,&BIT_HEADSET_NO_MIC);
if&(uei.checkSwitchExists())&{
retVal.add(uei);
Slog.w(TAG,&&This&kernel&does&not&have&wired&headset&support&);
&&&&&&&&&&&&return&retV
&&&&&&&&void&init()&{
&&&&&&&&&&&&synchronized&(mLock)&{
&&&&&&&&&&&&&&&&if&(LOG)&Slog.v(TAG,&&init()&);
&&&&&&&&&&&&&&&&char[]&buffer&=&new&char[1024];
&&&&&&&&&&&&&&&&for&(int&i&=&0;&i&&&mUEventInfo.size();&++i)&{
&&&&&&&&&&&&&&&&&&&&UEventInfo&uei&=&mUEventInfo.get(i);
&&&&&&&&&&&&&&&&&&&&try&{
&&&&&&&&&&&&&&&&&&&&&&&&int&curS
&&&&&&&&&&&&&&&&&&&&&&&&FileReader&file&=&new&FileReader(uei.getSwitchStatePath());
&&&&&&&&&&&&&&&&&&&&&&&&int&len&=&file.read(buffer,&0,&1024);
&&&&&&&&&&&&&&&&&&&&&&&&file.close();
&&&&&&&&&&&&&&&&&&&&&&&&curState&=&Integer.valueOf((new&String(buffer,&0,&len)).trim());
&&&&&&&&&&&&&&&&&&&&&&&&if&(curState&&&0)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&updateStateLocked(uei.getDevPath(),&uei.getDevName(),&curState);
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&}&catch&(FileNotFoundException&e)&{
&&&&&&&&&&&&&&&&&&&&&&&&Slog.w(TAG,&uei.getSwitchStatePath()&+
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&not&found&while&attempting&to&determine&initial&switch&state&);
&&&&&&&&&&&&&&&&&&&&}&catch&(Exception&e)&{
&&&&&&&&&&&&&&&&&&&&&&&&Slog.e(TAG,&&&&,&e);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&//&At&any&given&time&accessories&could&be&inserted
&&&&&&&&&&&&//&one&on&the&board,&one&on&the&dock&and&one&on&HDMI:
&&&&&&&&&&&&//&observe&three&UEVENTs
&&&&&&&&&&&&for&(int&i&=&0;&i&&&mUEventInfo.size();&++i)&{
&&&&&&&&&&&&&&&&UEventInfo&uei&=&mUEventInfo.get(i);
&&&&&&&&&&&&&&&&startObserving(&DEVPATH=&+uei.getDevPath());
&&&&&&&&&&&&}
通过来进行监听
startObserving(&DEVPATH=&+uei.getDevPath());
监听的节点是
shell@hammerhead:/&$&ls&sys/class/switch/&-l&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
lrwxrwxrwx&root&&&&&root&&&&&&&&&&&&&&&09:44&h2w&-&&../../devices/virtual/switch/h2w
在时间到来的时候更新
&&&&&&&&public&void&onUEvent(UEventObserver.UEvent&event)&{
&&&&&&&&&&&&if&(LOG)&Slog.v(TAG,&&Headset&UEVENT:&&&+&event.toString());
&&&&&&&&&&&&try&{
&&&&&&&&&&&&&&&&String&devPath&=&event.get(&DEVPATH&);
&&&&&&&&&&&&&&&&String&name&=&event.get(&SWITCH_NAME&);
&&&&&&&&&&&&&&&&int&state&=&Integer.parseInt(event.get(&SWITCH_STATE&));
&&&&&&&&&&&&&&&&synchronized&(mLock)&{
&&&&&&&&&&&&&&&&&&&&updateStateLocked(devPath,&name,&state);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}&catch&(NumberFormatException&e)&{
&&&&&&&&&&&&&&&&Slog.e(TAG,&&Could&not&parse&switch&state&from&event&&&+&event);
&&&&&&&&&&&&}
updateStateLocked(devPath,&name,&state)&
-&&&&updateLocked(String&newName,&int&newState)&&
-&&&&setDevicesState(int&headsetState,&int&prevHeadsetState,&String&headsetName)&&
-&&&&setDeviceStateLocked()
&-&&&mAudioManager.setWiredDeviceConnectionState(device,&state,&headsetName);在中会更新的状态,并最终调用
private&void&setDeviceStateLocked(int&headset,&int&headsetState,&int&prevHeadsetState,&String&headsetName)
if&((headsetState&&&headset)&!=&(prevHeadsetState&&&headset))&{
if&((headsetState&&&headset)&!=&0)&{
state&=&1;
state&=&0;
if&(headset&==&BIT_HEADSET)&{
device&=&AudioManager.DEVICE_OUT_WIRED_HEADSET;
}&else&if&(headset&==&BIT_HEADSET_NO_MIC){
device&=&AudioManager.DEVICE_OUT_WIRED_HEADPHONE;
}&else&if&(headset&==&BIT_USB_HEADSET_ANLG)&{
device&=&AudioManager.DEVICE_OUT_ANLG_DOCK_HEADSET;
}&else&if&(headset&==&BIT_USB_HEADSET_DGTL)&{
device&=&AudioManager.DEVICE_OUT_DGTL_DOCK_HEADSET;
}&else&if&(headset&==&BIT_HDMI_AUDIO)&{
device&=&AudioManager.DEVICE_OUT_AUX_DIGITAL;
Slog.e(TAG,&&setDeviceState()&invalid&headset&type:&&+headset);
Slog.v(TAG,&&device&&+headsetName+((state&==&1)&?&&&connected&&:&&&disconnected&));
if(headsetName.equals(&hdmi&)&&state==1){
Intent&intent=new&Intent(&android.intent.action.HDMI_PLUG&);
intent.putExtra(&state&,&1);
intent.putExtra(&name&,&&hdmi&);
mContext.sendBroadcast(intent);
mHdmiWakeLock.acquire();
Log.d(TAG,&---&hdmi&connect&&);
}else&if(headsetName.equals(&hdmi&)&&state==0){
Log.d(TAG,&---&hdmi&disconnect&&);
Intent&intent=new&Intent(&android.intent.action.HDMI_PLUG&);
intent.putExtra(&state&,&0);
intent.putExtra(&name&,&&hdmi&);
mContext.sendBroadcast(intent);
mHdmiWakeLock.release();
mAudioManager.setWiredDeviceConnectionState(device,&state,&headsetName);
AudioManager的实际是调用的方法。
public&void&setWiredDeviceConnectionState(int&device,&int&state,&String&name)&{
&&&&synchronized&(mConnectedDevices)&{
int&delay&=&checkSendBecomingNoisyIntent(device,&state);
queueMsgUnderWakeLock(mAudioHandler,
MSG_SET_WIRED_DEVICE_CONNECTION_STATE,&
&&&&&&&&device,&state,&name,&delay);
最终会发送到上层一个广播:
private&void&sendDeviceConnectionIntent(int&device,&int&state,&String&name)
Intent&intent&=&new&Intent();
intent.putExtra(&state&,&state);
intent.putExtra(&name&,&name);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
int&connType&=&0;
if&(device&==&AudioSystem.DEVICE_OUT_WIRED_HEADSET)&
connType&=&AudioRoutesInfo.MAIN_HEADSET;
intent.setAction(Intent.ACTION_HEADSET_PLUG);
intent.putExtra(&microphone&,&1);
}&else&if&(device&==&AudioSystem.DEVICE_OUT_WIRED_HEADPHONE)&
connType&=&AudioRoutesInfo.MAIN_HEADPHONES;
intent.setAction(Intent.ACTION_HEADSET_PLUG);
intent.putExtra(&microphone&,&0);
}&else&if&(device&==&AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET)&{
connType&=&AudioRoutesInfo.MAIN_DOCK_SPEAKERS;
intent.setAction(Intent.ACTION_ANALOG_AUDIO_DOCK_PLUG);
}&else&if&(device&==&AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET)&{
connType&=&AudioRoutesInfo.MAIN_DOCK_SPEAKERS;
intent.setAction(Intent.ACTION_DIGITAL_AUDIO_DOCK_PLUG);
}&else&if&(device&==&AudioSystem.DEVICE_OUT_AUX_DIGITAL)&{
connType&=&AudioRoutesInfo.MAIN_HDMI;
intent.setAction(Intent.ACTION_HDMI_AUDIO_PLUG);
synchronized&(mCurAudioRoutes)&{
if&(connType&!=&0)&{
int&newConn&=&mCurAudioRoutes.mMainT
if&(state&!=&0)&{
newConn&|=&connT
newConn&&=&~connT
if&(newConn&!=&mCurAudioRoutes.mMainType)&{
mCurAudioRoutes.mMainType&=&newC
sendMsg(mAudioHandler,&MSG_REPORT_NEW_ROUTES,
SENDMSG_NOOP,&0,&0,&null,&0);
final&long&ident&=&Binder.clearCallingIdentity();
ActivityManagerNative.broadcastStickyIntent(intent,&null,&UserHandle.USER_ALL);
}&finally&{
Binder.restoreCallingIdentity(ident);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:43976次
排名:千里之外
原创:15篇
转载:22篇
评论:13条
(1)(2)(1)(1)(2)(2)(1)(3)(1)(1)(4)(2)(1)(1)(4)(8)(1)(2)(1)

我要回帖

更多关于 耳机品牌 的文章

 

随机推荐