全局監(jiān)聽系統(tǒng)音量變化。屏蔽系統(tǒng)音量提示框展示問題

簡述:

自己遇到的需求:在自己app?中余佃,全局監(jiān)聽音量變化暮刃,就是用戶按設(shè)備的加減聲音鍵,然后將音量變化展示到界面上(一個seekbar)爆土。

正文:

1:監(jiān)聽系統(tǒng)音量變化(廣播)

因為設(shè)備是安卓11的椭懊,記得好像安卓版本高于8.0?不允許靜態(tài)廣播監(jiān)聽系統(tǒng)廣播,沒辦法步势,只能動態(tài)注冊氧猬。上代碼吧:

廣播類:

public class MediaButtonIntentRecieverextends BroadcastReceiver{

? ? private static final StringTAG = MediaButtonIntentReciever.class.getSimpleName();

? ? private AudioManagermAudioManager;

? ? private PopupWindowmPopupWindow;

? ? private int mMediaMaxVolume;

? ? private int mMediaVolume;

? ? private SeekBarmCar_volume;

? ? private CountDownTimercountDownTimer;

? ? public MediaButtonIntentReciever() {

}

? ? @Override

? ? public void onReceive(Context context, Intent intent) {

? ? ? ? if (intent !=null) {

? ? ? ? ? ? if (intent.getAction().equals("android.media.VOLUME_CHANGED_ACTION")) {

? ? ? ? ? ? ? ? //監(jiān)聽音量

? ? ? ? ? ? ? ? InitVolume(context);

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? //監(jiān)聽音量

? ? private void InitVolume(Context context) {

? ? ? ? //獲取音量管理器

? ? ? ? if (mAudioManager ==null) {

? ? ? ? ? ? mAudioManager =(AudioManager) context.getSystemService(Service.AUDIO_SERVICE);

? ? ? ? }

? ? ? ? //當(dāng)前音量

? ? ? ? mMediaVolume =mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

? ? ? ? //最大音量

? ? ? ? mMediaMaxVolume =mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

? ? ? ? LogUtil.e("===當(dāng)前音量:" +mMediaVolume);

? ? ? ? startPopupWindow(context);

? ? }

? ? private void startPopupWindow(Context context) {

? ? ? ? View inflate = LayoutInflater.from(context).inflate(R.layout.volume_popup, null);

? ? ? ? if (mPopupWindow ==null) {

? ? ? ? ? ? mPopupWindow =new PopupWindow(inflate, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

? ? ? ? }

? ? ? ? mPopupWindow.setBackgroundDrawable(null);

? ? ? ? mPopupWindow.setOutsideTouchable(true);

? ? ? ? //主界面linealayout的id,并給自己定義的popwindow xml文件backgrount? ? android:background="#33000000"

? ? ? ? mPopupWindow.showAtLocation(new View(context), Gravity.TOP, Gravity.CENTER_HORIZONTAL, Gravity.TOP);

? ? ? ? init();

? ? ? ? inflate.setOnClickListener(new View.OnClickListener() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void onClick(View v) {

? ? ? ? ? ? ? ? mPopupWindow.dismiss();

? ? ? ? ? ? ? ? countDownTimer.cancel();

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? if (mCar_volume ==null) {

? ? ? ? ? ? mCar_volume = inflate.findViewById(R.id.car_volume);

? ? ? ? }

? ? ? ? //seekbar設(shè)置最大值為最大音量

? ? ? ? mCar_volume.setMax(mMediaMaxVolume);

? ? ? ? mCar_volume.setOnTouchListener(new View.OnTouchListener() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public boolean onTouch(View v, MotionEvent event) {

? ? ? ? ? ? ? ? return true;

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? mCar_volume.setProgress(mMediaVolume);

? ? }

? ? //seekbar設(shè)置當(dāng)前進度為當(dāng)前音量

? ? private void setView() {

? ? ? ? LogUtil.e("===音量改變:" +mMediaVolume);

? ? ? ? mCar_volume.setProgress(mMediaVolume);

? ? }

? ? private void init() {

? ? ? ? //重新計時

? ? ? ? if (countDownTimer !=null) {

? ? ? ? ? ? countDownTimer.cancel();

? ? ? ? }

? ? ? ? //初始化CountTimer坏瘩,設(shè)置倒計時時間

? ? ? ? countDownTimer =new CountDownTimer(5000, 1000) {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void onTick(long l) {

//? ? ? ? ? ? ? ? onActivityTick(l);

? ? ? ? ? ? ? ? LogUtil.e("音量彈窗倒計時--------" + l);

? ? ? ? ? ? }

? ? ? ? ? ? @Override

? ? ? ? ? ? public void onFinish() {

? ? ? ? ? ? ? ? //長時間未操作 啟動廣告頁

//? ? ? ? ? ? ? ? onActivityFinish();

? ? ? ? ? ? ? ? mPopupWindow.dismiss();

? ? ? ? ? ? ? ? countDownTimer.cancel();

? ? ? ? ? ? }

? ? ? ? };

? ? ? ? new Handler(getMainLooper()).post(new Runnable() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? countDownTimer.start();

? ? ? ? ? ? }

? ? ? ? });

? ? }

? ? private void timeStart() {

}

}


broadcastreceiver中代碼有點亂盅抚,懶得改了,著急總結(jié)完下班 -.- !?有注釋倔矾,相信差不多都能看懂

可以在onReceive回調(diào)中妄均,進行處理自己想要的。我這邊是彈出一個popupwindow,里面有一個seekbar丛晦,根據(jù)音量調(diào)節(jié)奕纫,seekbar進行滑動。

還有一個五秒消失seekbar烫沙,當(dāng)音量發(fā)生改變匹层,倒計時重新計時。


? ? 清單文件:

? ??<receiver

????android:name=".receiver.MediaButtonIntentReciever"

? ? android:permission="android.permission.RECEIVE_VOLUME_CHANGED_ACTION"

? ? android:enabled="true"

? ? android:exported="true">

? ? <intent-filter>

? ? ? ? <action android:name="android.media.VOLUME_CHANGED_ACTION" />

? ? </intent-filter>

</receiver>


首先在清單文件注冊锌蓄。

因為是全局監(jiān)聽的升筏,所以我這邊是直接在base層的activity中,進行注冊廣播瘸爽。

下面分別是注冊廣播代碼和銷毀廣播代碼:

private void initBroatCastReceiver() {

? ? mIntentFilter =new IntentFilter();

? ? mIntentFilter.addAction("android.media.VOLUME_CHANGED_ACTION");

? ? mReciever =new MediaButtonIntentReciever();

? ? registerReceiver(mReciever, mIntentFilter);

? ? LogUtil.e("=====注冊廣播");

}

private void onDestoryRevicer() {

? ? unregisterReceiver(mReciever);

? ? LogUtil.e("=====銷毀廣播");

}


注冊和銷毀廣播

因為是全局的您访,所以寫在了baseActivity中,之后在baseActivity中的onStart和onPase回調(diào)中分別調(diào)用注冊和注銷廣播方法剪决。?


有一個問題灵汪,就是系統(tǒng)自己的音量調(diào)節(jié)提示框也會展示,所以還需要在baseActivity中柑潦,添加一段代碼:

//調(diào)節(jié)音量時享言,不展示系統(tǒng)音量進度條

@Override

public boolean dispatchKeyEvent(KeyEvent event) {

? ? if (mAudioManager ==null) {

? ? ? ? mAudioManager =(AudioManager) this.getSystemService(Service.AUDIO_SERVICE);

? ? }

? ? //小聲鍵

? ? if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) {

? ? ? ? mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, 0);

return true;

? ? } else if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) {

? ? ? ? //大聲鍵

? ? ? ? mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);

return true;

? ? }

? ? return super.dispatchKeyEvent( event);

}

這樣就能做到,app中調(diào)大調(diào)小音量渗鬼,系統(tǒng)的音量提示框不展示览露,自己的seekbar展示音量提醒。?

沒法加效果視頻 - - !??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末譬胎,一起剝皮案震驚了整個濱河市差牛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌堰乔,老刑警劉巖偏化,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浩考,居然都是意外死亡夹孔,警方通過查閱死者的電腦和手機被盈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門析孽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人只怎,你說我怎么就攤上這事袜瞬。” “怎么了身堡?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵邓尤,是天一觀的道長。 經(jīng)常有香客問我,道長汞扎,這世上最難降的妖魔是什么季稳? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮澈魄,結(jié)果婚禮上景鼠,老公的妹妹穿的比我還像新娘。我一直安慰自己痹扇,他們只是感情好铛漓,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鲫构,像睡著了一般浓恶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上结笨,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天包晰,我揣著相機與錄音,去河邊找鬼炕吸。 笑死杜窄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的算途。 我是一名探鬼主播塞耕,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嘴瓤!你這毒婦竟也來了扫外?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤廓脆,失蹤者是張志新(化名)和其女友劉穎筛谚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體停忿,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡驾讲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了席赂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吮铭。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖颅停,靈堂內(nèi)的尸體忽然破棺而出谓晌,到底是詐尸還是另有隱情,我是刑警寧澤癞揉,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布纸肉,位于F島的核電站溺欧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柏肪。R本人自食惡果不足惜姐刁,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烦味。 院中可真熱鬧龙填,春花似錦、人聲如沸拐叉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凤瘦。三九已至宿礁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔬芥,已是汗流浹背梆靖。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笔诵,地道東北人返吻。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像乎婿,于是被迫代替她去往敵國和親测僵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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