Android BroadcastReceiver 實(shí)時(shí)監(jiān)聽(tīng)耳機(jī)拔出事件

寫作背景:最近在做視頻播放器啼止,客戶提出兩項(xiàng)新需求:

  • 插耳機(jī)看視頻道逗,拔出耳機(jī),視頻需要暫停献烦。
  • 視頻播放時(shí)滓窍,按耳機(jī)按鈕,視頻暫停播放巩那;再按耳機(jī)按鈕吏夯,視頻暫停。

第一個(gè)問(wèn)題拢操,插耳機(jī)看視頻時(shí)锦亦,如何監(jiān)聽(tīng)到耳機(jī)拔出事件然后讓視頻暫停呢?
------ 在視頻播放界面令境,注冊(cè)并建立一個(gè)BroadcastReceiver杠园,并監(jiān)聽(tīng)拔除耳機(jī)的事件。當(dāng)接收到耳機(jī)拔出事件后舔庶,將視頻暫停播放即可抛蚁。

BroadcastReceiver機(jī)制介紹


BroadcastReceiver Introduction

  • 廣播發(fā)送
    Normal broadcasts(普通廣播):通過(guò)Context.sendBroadcast(intent)方式發(fā)送廣播。
    廣播發(fā)出后惕橙,幾乎同時(shí)到達(dá)多個(gè)廣播接收者處瞧甩,廣播接收者無(wú)法終止廣播繼續(xù)傳播。核心代碼Example:
Intent intent = new Intent();
intent.setAction("com.action.changestatues");
context.sendBroadcast(intent);

Ordered broadcasts(有序廣播):
通過(guò)Context.sendOrderedBroadcast(intent弥鹦,null)發(fā)送廣播肚逸;
通過(guò)abortBroadcast()終止廣播;
廣播接收者通過(guò)設(shè)置優(yōu)先級(jí)來(lái)決定誰(shuí)可以先接收到廣播彬坏,優(yōu)先級(jí)數(shù)值范圍為-1000~1000朦促。優(yōu)先級(jí)通過(guò)在AndroidManifest.xml中<intent-filter android:priority="number">設(shè)置。優(yōu)先級(jí)高的接收者在接收到廣播后栓始,可以對(duì)廣播進(jìn)行處理务冕,比如:終止廣播繼續(xù)傳遞,或向廣播中添加數(shù)據(jù)繼續(xù)傳遞給下一個(gè)接收者等幻赚。核心代碼Example:

Intent intent = new Intent();
intent.setAction("com.action.changestatues");
context.sendOrderedBroadcast(intent,null);
  • ** 廣播接收**
    廣播接收者禀忆,就是負(fù)責(zé)接收和處理廣播的類,該類繼承BroadcastReceiver類落恼,并重寫
    public void onReceive(Context context,Intent intent)方法箩退,其中intent可以獲得廣播傳遞的數(shù)據(jù);通過(guò)intent.getAction()可以得到廣播intent設(shè)置的Action佳谦。比如戴涝,某個(gè)廣播發(fā)送的Action為"android.intent.action.MEDIA_BUTTON",則所有在AndroidManifest.xml中設(shè)置過(guò)<action android:name="android.intent.action.MEDIA_BUTTON"/>的廣播接收者都能夠接收到該廣播。

  • 廣播注冊(cè)和廣播注銷
    如果需要在某個(gè)類中實(shí)現(xiàn)廣播的接收喊括,就有需要用到廣播的注冊(cè)和注銷。這里需要注意的是矢棚,注冊(cè)的廣播要在不使用的情況下注銷掉郑什。如果在Activity.onResume()方法中進(jìn)行了注冊(cè),需要在Activity.onPause()方法中進(jìn)行注銷蒲肋。為了節(jié)省系統(tǒng)開銷蘑拯,當(dāng)Activity處于暫停狀態(tài)時(shí),不會(huì)接收到廣播兜粘。廣播注冊(cè)和接收的位置視具體情況而定申窘。
    核心代碼Example:

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if ( action.equals(ALARM_ALERT)) {
                //鬧鈴想起時(shí),可以暫停視頻或做其他事情
                doFirstthing();
            } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
               //屏幕鎖定時(shí)孔轴,可以暫停視頻播放或做其他事情
                doSecondthing();
            }else if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
                //耳機(jī)拔出時(shí)剃法,可以暫停視頻播放或做其他事情
                doOtherthing();
            }
        }
    };

    @Override
    public void onResume() {
        super.onResume();
        //注冊(cè)廣播接收器,給廣播接收器添加可以接收的廣播Action
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(ALARM_ALERT);
        filter.addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
        registerReceiver(mReceiver, filter);
    }

    @Override
    protected void onPause() {
        //注銷廣播
        unregisterReceiver(mReceiver);
        super.onStop();
    }

AudioManager.ACTION_AUDIO_BECOMING_NOISY介紹

廣播intent路鹰,提示應(yīng)用程序音頻信號(hào)由于音頻輸出的變化將變得“嘈雜”贷洲。
例如,當(dāng)拔出一個(gè)有線耳機(jī)晋柱,或斷開一個(gè)支持A2DP的音頻接收器优构,這個(gè)intent就會(huì)被發(fā)送,且音頻系統(tǒng)將自動(dòng)切換音頻線路到揚(yáng)聲器雁竞。收到這個(gè)intent后钦椭,控制音頻流的應(yīng)用程序會(huì)考慮暫停,減小音量或其他措施碑诉,以免揚(yáng)聲器的聲音使用戶驚奇彪腔。

至此,第一個(gè)需求已經(jīng)完成联贩,感謝收看漫仆!
END

如果你一不小心,已經(jīng)看完了泪幌,恭喜你盲厌,并沒(méi)有彩蛋。
我只能祝福你成為
一個(gè)年輕的夢(mèng)想者祸泪,
熱愛(ài)代碼吗浩,
不受束縛!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末没隘,一起剝皮案震驚了整個(gè)濱河市懂扼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖阀湿,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赶熟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡陷嘴,警方通過(guò)查閱死者的電腦和手機(jī)映砖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)灾挨,“玉大人邑退,你說(shuō)我怎么就攤上這事±统危” “怎么了地技?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)秒拔。 經(jīng)常有香客問(wèn)我莫矗,道長(zhǎng),這世上最難降的妖魔是什么砂缩? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任趣苏,我火速辦了婚禮,結(jié)果婚禮上梯轻,老公的妹妹穿的比我還像新娘食磕。我一直安慰自己,他們只是感情好喳挑,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布彬伦。 她就那樣靜靜地躺著,像睡著了一般伊诵。 火紅的嫁衣襯著肌膚如雪单绑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天曹宴,我揣著相機(jī)與錄音搂橙,去河邊找鬼。 笑死笛坦,一個(gè)胖子當(dāng)著我的面吹牛区转,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播版扩,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼废离,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了礁芦?” 一聲冷哼從身側(cè)響起蜻韭,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤悼尾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后肖方,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闺魏,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年俯画,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舷胜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡活翩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翻伺,到底是詐尸還是另有隱情材泄,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布吨岭,位于F島的核電站拉宗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辣辫。R本人自食惡果不足惜旦事,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望急灭。 院中可真熱鬧姐浮,春花似錦、人聲如沸葬馋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)畴嘶。三九已至蛋逾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窗悯,已是汗流浹背区匣。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒋院,地道東北人亏钩。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像欺旧,于是被迫代替她去往敵國(guó)和親铸屉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容