android耳機插拔
❶ 安卓耳機模式怎麼關閉
這個是一個android系統不常見的問題,有幾款機型涉及這個問題。 你找個耳機插拔看看能不能退出了耳機模式,如果能就正常了,或者刷機後發現依然是耳機模式,那基本就是耳機介面的導電問題了
❷ 手機沒有聲音顯示耳機
手機沒聲音顯示耳機圖標,證明手機已經與耳機連接成功了。如果耳機里沒有聲音,是耳機插孔的微動開關故障引起的,可以試著關機再重啟試試看。
智能手機(又稱作智慧型手機、智能型電話,英語:Smartphone)是對於那些運算能力及功能比傳統功能手機更強的手機的集合性稱謂。智能手機使用最多的操作系統有:Symbian(已退市)、Windows Phone、Android、IOS和BlackBerry OS,但他們之間的應用軟體互不兼容。智能手機因為可以像個人電腦一樣安裝第三方軟體,所以它們功能豐富,而且可以不斷擴充。智能手機(Smartphone),是指「像個人電腦一樣,具有獨立的操作系統,可以由用戶自行安裝軟體、游戲等第三方服務商提供的程序,通過此類程序來不斷對手機的功能進行擴充,並可以通過移動通訊網路來實現無線網路接入的這樣一類手機的總稱」。通常使用的操作系統有:Symbian、Windows Mobile、Windows phone、 iOS、 linux (含Android、 Maemo、 MeeGo 和WebOS)、Palm OS和BlackBerry OS。
❸ 索尼耳機插到安卓手機上不顯示耳機圖標,耳機里也沒有聲音!
依據描述~疑似是「時常插拔耳機,以致於插頭與耳機孔內金屬件接觸不良(細微磨損)」
❹ 安卓手機耳機沒有聲音怎麼回事
如果您使用的是華為手機,目前華為手機支持Type-C介面耳機或3.5mm介面耳機,如果出現耳機無聲問題,請按照下列內容排查:
請檢查耳機介面內是否入液,有異物
建議您用手電筒照射耳機孔,如有異物清潔出來即可;如有入液情況,建議您備份數據,盡快攜帶手機前往華為客戶服務中心進行專業清理。
請交叉驗證是否為耳機故障
1. 如果您使用的是華為耳機,建議將耳機插在其他華為手機上進行測試。
如果其他華為手機上也無法使用,可能是耳機損壞,建議更換耳機。
如果其他華為手機上可以正常使用,可能是耳機孔接觸不好或者損壞,可嘗試重新插拔耳機並適當旋轉耳機插頭。如果仍然不行,建議備份數據,攜帶購機憑證前往華為客戶服務中心檢測。
2. 如果您使用的非華為耳機,可能存在耳機與手機不兼容的問題,建議更換華為原裝耳機後嘗試使用。
使用轉接線後耳機沒有聲音
如果手機使用轉介面之後耳機無聲,建議使用原裝介面的耳機驗證,如果聲音正常,可能是轉接線與手機介面不兼容,建議您更換轉接線。
仍然無法解決您的問題
如果以上方法仍然無法解決您的問題,建議備份好重要數據(第三方通訊類應用需單獨備份),攜帶手機、耳機和購機憑證,前往華為客戶服務中心檢測。
❺ 安卓手機外放沒聲音是哪裡出了問題
如果您使用的是華為手機,手機外放無聲音,可以通過以下方法進行排查處理:
1,查看手機是否顯示耳機圖標
如果手機未插入耳機,仍顯示耳機圖標,會導致手機外放無聲,出現該現象的原因有多種可能為進入液體、受潮、進灰等情況或者耳機是否標配都可能會影響到耳機孔功能。您可以按照以下方法嘗試解決:
(1)、請嘗試插拔一次耳機或重啟手機進行嘗試
(2)、如果耳機孔有入液、進灰等情況,請嘗試清理。
(3)、如果您的手機顯示仍然異常,請您,提前備份好數據(QQ,微信等第三方應用需單獨備份)、攜帶相關購機憑證,前往附近的華為客戶服務中心,獲取更多幫助
2,確保喇叭沒有被遮擋
3,重啟手機或更換播放音源後嘗試;
4,獲取更多幫助
如果您的手機外放仍然異常,請您提前備份好數據(QQ,微信等第三方應用需單獨備份)、攜帶相關購機憑證,前往附近的華為客戶服務中心,獲取更多幫助
相關鏈接如下:客戶服務中心預約服務維修備件價格查詢寄修服務
❻ android怎麼接收耳機插拔廣播
接收耳機的廣播就可以了!耳機廣播為:Intent.ACTION_HEADSET_PLUG ,動態注冊!
❼ android聲音通道怎麼理解
由於使用的是耳機 麥克分離式的耳機,所以要分別上報事件。在Android系統層耳機插孔的檢測是基於/sys/class/switch/h2w/state的值來判斷的(以4.4.4_r2為例子位於WiredAccessoryManager.java)。
只要在內核中實現一個「或真或假」的基於switch類的h2w開關。Android系統就可以監聽到插拔信息。
在播放音樂的時候插入耳機,使用tinymix(參考:Android音頻底層調試-基於tinyalsa)命令可以查找到Playback Path的值從SPK變為HP_NO_MIC,就可以說明耳機插拔軟體檢測正常了。
# tinymix
Mixer name: 'RK_RK616_TINY'
Number of controls: 7
ctl type num name value
0 ENUM 1 Playback Path HP_NO_MIC
1 ENUM 1 Capture MIC Path MIC OFF
2 ENUM 1 Voice Call Path OFF
3 ENUM 1 Voip Path OFF
4 INT 2 Speaker Playback Volume 24 24
5 INT 2 Headphone Playback Volume 24 24
6 ENUM 1 Modem Input Enable ON
❽ android耳機插拔監聽做不了全局注冊嗎
1. 耳機檢測的硬體原理
一般的耳機檢測包含普通的耳機檢測和帶mic的耳機檢測兩種,這兩種耳機統稱為Headset,而對於不帶mic的耳機,一般稱之為Headphone。
對於Headset裝置的插入檢測,一般通過Jack即耳機插座來完成,大致的原理是使用帶檢測機械結構的耳機插座,將檢測腳連到可GPIO中斷上,當耳機插入時,耳機插頭的金屬會碰到檢測腳,使得檢測腳的電平產生變化,從而引起中斷。這樣就可以在中斷處理函數中讀取GPIO的的值,進一步判斷出耳機是插入還是拔出。
而對於Headset是否帶mic的檢測,需要通過codec附加的micbias電流的功能。
Android耳機插拔可以有兩個機制實現:
1. InputEvent
2. UEvent
其中UEvent是Android系統默認的耳機插拔機制,所以這里代碼是基於UEvent實現的,對於InputEvent機制只是大概看了看,並沒有具體實現。
1.1 兩種機制的切換
Android默認提供了兩種解決方法,那麼一定也提供了兩種方式的切換,這個提供切換的設置名為config_useDevInputEventForAudioJack( 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源代碼進行全局搜索,可以看到它在frameworks/base/core/res/res/values/config.xml中,默認為false,即不使用InputEvent方式,另外在源碼包的廠商相關的文件夾中也找到了相關的設置,如下:
/android/4.2/device/asus/flo/overlay/frameworks/base/core/res/res/values/config.xml
false
/android/4.2/device/samsung/manta/overlay/frameworks/base/core/res/res/values/config.xml
True
可以看到有些廠商的確是使用了InputEvent的方式來進行耳機檢測。具體對這個變數的修改是在device下還是frameworks下我想應該都可以,device下可能更好。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的處理主要在frameworks/base/services/java/com/android/server/input/
InputManagerService.java中。在InputManagerService構造函數中,通過如下函數,
mUseDevInputEventForAudioJack = context.getResources().
getBoolean(R.bool.config_useDevInputEventForAudioJack);
判斷當前是否通過InputEvent實現耳機插拔檢測。
當Android得到InputEvent後,會調用InputManagerService.java中notifySwitch的函數,進而轉至WiredAccessoryManager.java文件中的notifyWiredAccessoryChanged函數,之後的流程就和UEvent相同了,在後續會講到。
2.2 Kernel層的處理機制
Kernel層對耳機插拔InputEvent處理主要是通過input_report_key/input_report_switch(include/linux/input.h)來實現,而在實際使用中,ASOC已經為我們封裝好了相應Jack介面函數,只要符合規范就可以拿來使用。下面列出幾個常用的介面函數(/sound/soc/soc-jack.c)。
int snd_soc_jack_new(structsnd_soc_codec *codec,
const char *id, int type, struct snd_soc_jack *jack)
生成一個新的jack對象,定義其被檢測的類型,即可能插入的設備類型。一般定義為SND_JACK_HEADSET,其餘也可以根據介面支持種類添加SND_JACK_LINEOUT,SND_JACK_AVOUT等。
這個函數中調用了snd_jack_new,而在snd_jack_new中可以看到調用 input_allocate_device()分配了input device,就可以在後續產生input event了。
int snd_soc_jack_add_pins(structsnd_soc_jack *jack, int count, struct snd_soc_jack_pin *pins)
將之前定義好的pins加入dapm widgets中,方便dapm統一管理。這一步和InputEvent沒有一定聯系,可以不調用,主要是可以將耳機插座定義為widgets加入dapm進行省電管理。
viod snd_soc_jack_report(structsnd_soc_jack *jack, int status, int mask)
匯報jack插拔狀態,主要完成以下兩個工作:
a) 根據插入拔出狀態更新前面通過snd_soc_jack_add_pins加入的dapm pin的狀態,對其進行上電下電管理。
b) 調用snd_jack_report,在其中通過input_report_key/input_report_switch來向上層匯報input event。
基於上面的函數,可以用以下做法來實現基於InputEvent機制的耳機插拔檢測:
a) snd_soc_jack_new 創建jack對象
b) snd_soc_jack_add_pins將其加入到dapm wigets中
c) 通過request irq申請耳機插拔中斷,在中斷處理函數中通過檢測線高低電平判斷耳機是插入還是拔出,通過讀取codec寄存器來判斷是headset還是headphone
d) 根據判斷結果調用snd_soc_jack_report發送InputEvent
此外,ASOC還提供了一個封裝好的函數來實現上述c)和d)步驟的功能:
int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
struct snd_soc_jack_gpio *gpios)
該函數通過標准GPIO驅動申請GPIO及GPIO對應中斷,並提供了統一的中斷處理函數來匯報事件。此函數只適用於耳機中斷接至GPIO且GPIO驅動為Linux標准驅動的情況下,並且不支持mic檢測。
3. UEvent
3.1 Switch 基本原理
Switch是Android引進的新的驅動,目的是用於檢測一些開關量,比如檢測耳機插入、檢測 USB 設備插入等。Switch在sysfs文件系統中創建相應entry,用戶可以通過sysfs與之交互; 此外還可以通過uevent機制與之交互, 從而檢測switch狀態。
3.1.1 Switch的實現
Switch class在Android中實現為一個mole,可動態載入;而具體的switch gpio則是基於 platform device框架。代碼在drivers\switch\switch_class.c和drivers\switch\switch_gpio.c中。其中switch_class.c實現了一個switch class,而switch_gpio.c則是這個class中的一個device,即針對gpio的一個switch設備。
switch_class.c文件創建了一個switch_class,實現了內核的switch機制,提供支持函數供其他switch device驅動調用。
static int __init switch_class_init(void){
return create_switch_class(); }
static void __exit switch_class_exit(void){
class_destroy(switch_class); }
mole_init(switch_class_init);
mole_exit(switch_class_exit);
init函數調用create_switch_class->class_create創建switch_class設備類。相對應 exit則是銷毀這個設備類。
該文件導出兩個函數供其他switch設備驅動調用,分別是注冊switch設備switch_dev_register和注銷switch_dev_unregister(drivers/switch/switch_class.c)。
int switch_dev_register(struct switch_dev *sdev)
{
int ret;
if (!switch_class) {
ret = create_switch_class();
if (ret < 0)
return ret;
}
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 ret;
}
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);
然後是兩個sysfs操作函數(state_show和name_show),分別用於輸出switch device的name和state。當用戶讀取sysfs中對應的switch entry(/sys/class/switch/<dev_name>/name和/sys/class/switch/<dev_name>/state)時候,系統會自動調用這兩個函數向用戶返回switch設備的名稱和狀態。
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 ret;
}
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 ret;
}
return sprintf(buf, "%s\n", sdev->name);
}
可見,這兩個函數就是直接調用對應的switch_dev中的print_state和print_name函數;如果沒有定義這兩個函數,則調用sprintf把信息列印到buf緩沖區里。
最後是 switch_set_state 函數,該函數是內核內部使用,並不為用戶調用,它完成的功能主要是兩件事: 調用name_show和state_show輸出switch設備名稱和狀態至sysfs文件系統;發送uevent通知用戶switch device的信息(名稱和狀態) 。
switch_gpio.c文件基於switch class實現了一個gpio的switch設備驅動,其實現的原理如下: 基於platform device/driver框架,在probe函數中完成初始化,包括獲取gpio的使用許可權,設置gpio方向為輸入,注冊switch_dev設備,為gpio分配中斷,指定中斷服務程序,初始化一個gpio_switch_work工作,最後讀取gpio初始狀態。
當 GPIO 引腳狀態發生變化時,則會觸發中斷,在中斷服務程序中調用schele_work,這個被schele的work即前面初始化的gpio_switch_work,最後這個work被執行,在gpio_switch_work函數中讀取當前gpio電平,調用 switch_set_state更新sysfs並通過 uevent通知上層應用。
這個設備驅動只實現了print_state函數:switch_gpio_print_state,沒有實現 print_name函數。當gpio_switch_work執行的時候,裡面調用switch_set_state->switch_gpio_print_state輸出GPIO狀態到 sysfs。
3.1.2 Switch模塊的用戶介面
sysfs文件為sys/class/switch/<dev_name>/name, sys/class/switch/<dev_name>/state,uevent環境變數為SWITCH_NAME=<name>, SWITCH_STATE=<state>。sysfs文件系統和uevent機制。
UEvent機制比較簡單,它基於switch driver,switch driver會在Android建立耳機插拔的目錄/sys/devices/virtual/switch/h2w,在此目錄下有個設備結點名為state,driver通過更新state的值,從而通知Android上層耳機狀態的改變。
3.2 Framework層對UEvent的處理機制
Android在frameworks/base/services/java/com/android/server/WiredAccessoryManager. java中實現針對UEvent的機制。
在這個文件中,從UEventObserver中繼承了類WiredAccessoryObserver,在makeObservedUEventList中將要觀察的事件加入到UEvent系統中:
if(!mUseDevInputEventForAudioJack)
{
uei = new UEventInfo(NAME_H2W,BIT_HEADSET, BIT_HEADSET_NO_MIC);
……
}
可以看到,只有當不使用InputEvent時才添加UEvent事件,NAME_H2W就是headphone對應的switch driver的名字。BIT_HEADSET和BIT_HEADSET_NO_MIC是state結點的兩個值,分別表示有mic和無mic的耳機。
當UEvent事件到來時,類WiredAccessoryObserver中重載的onUEvent函數會被回調,從而調用updateStateLocked(devPath,name, state) ,其中state的值就是通過/sys/devices/virtual/switch/h2w/state結點來獲得。
最後,程序會進入setDeviceStateLocked函數中處理,在setDeviceStateLocked中根據state的值設置device,然後調用mAudioManager.setWiredDeviceConnectionState,最後進入AudioPolicyManagerBase::setDeviceConnectionState。
3.3 Kernel層的機制
前面說過,基於UEvent的耳機檢測機制需要實現一隻switch driver,它會建立一個用於耳機插拔檢測的目錄/sys/devices/virtual/switch/h2w,在此目錄下有個設備結點名為state,switch driver通過更新state的值,從而通知Android上層耳機狀態的改變。
switch driver的目錄在Linux kernel的drivers/staging/android/switch目錄下,可以從目錄名稱中看到這只driver是為了Android專門產生的。在switch目錄下有兩個已有文件,switch_class.c是switch driver的內部實現,它提供了switch driver所需的一些API;switch_gpio.c是一個例子,它實現了一個基於GPIO中斷的switch driver。
另外,在drivers/switch目錄下也有同樣的文件,不同之處是兩者在Android下生成的結點的位置不同,如果要按照drivers/switch目錄下的switch driver來實現,需要更改WiredAccessoryManager.java文件。
下面講講如何添加switch driver。添加switch driver很簡單,可以仿照switch_gpio.c,大致步驟如下:
a) 在drivers/staging/android/switch目錄下新建一個platform driver,其中包含一個全局變數struct switch_dev sdev,即要注冊的switch device。
b) 在platformdriver的probe函數中調用switch_dev_register將前面的sdev注冊到系統中。
c) 申請用於耳機檢測的中斷處理函數。對於耳機插拔來說,由於用戶的插拔快慢等可能產生多次中斷,所以一般是在中斷處理函數中實現一個延時工作隊列,即INIT_DELAYED_WORK,在隊列的回調函數中來進行實際判斷。
d) 當中斷發生後,通過switch_set_state設置state節點的值,這個值要和WiredAccessoryManager.java文件中定義的一致,可參看BIT_HEADSET和BIT_HEADSET_NO_MIC的定義。目前是0表示無耳機插入,1表示帶Mic的耳機,2表示不帶Mic的耳機。switch_set_state這個函數調用了kobject_uevent_env/kobject_uevent,這兩個函數就是kernel通過uevent來通知user space的核心函數了。
❾ 為什麼我的耳機叉不進手機,小米4 是安卓的耳機呀
1,這種情況應該是這台小米4手機進入耳機模式了。
2,應該是耳機孔微動開關失效引起的,就是耳機已拔出,但開關並沒及時斷開導致的。
3,可以嘗試多次快速的插拔耳機試試看或是重新啟動手機試試看。
4,如果還是不行的話,應該要拿到小米手機的售後網點檢測一下或更換新的耳機插孔。
❿ 安卓手機顯示耳機模式怎麼關閉
按照如下方法進行操作:
1、耳機模式是在有耳機插入的情況下才會出現的。
2、如果沒有插入耳機,可以看看耳機插孔裡面是不是有異物。
3、如果沒有任何異物,可嘗試重啟一下,然後播放音樂或視頻,看看是否有外音。
4、如果沒有插耳機、插孔內也沒有異物、播放音頻和視頻都沒有外音的話,可能就是系統錯誤。建議到手機售後維修點刷機,若在保修期內,這種工作是免費的。
拓展資料
手機耳機模式解決方法:
1、點擊手機設置。