简述:
自己遇到的需求:在自己app 中,全局监听音量变化,就是用户按设备的加减声音键,然后将音量变化展示到界面上(一个seekbar)。
正文:
1:监听系统音量变化(广播)
因为设备是安卓11的,记得好像安卓版本高于8.0 不允许静态广播监听系统广播,没办法,只能动态注册。上代码吧:
广播类:
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")) {
//监听音量
InitVolume(context);
}
}
}
//监听音量
private void InitVolume(Context context) {
//获取音量管理器
if (mAudioManager ==null) {
mAudioManager =(AudioManager) context.getSystemService(Service.AUDIO_SERVICE);
}
//当前音量
mMediaVolume =mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
//最大音量
mMediaMaxVolume =mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
LogUtil.e("===当前音量:" +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设置最大值为最大音量
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设置当前进度为当前音量
private void setView() {
LogUtil.e("===音量改变:" +mMediaVolume);
mCar_volume.setProgress(mMediaVolume);
}
private void init() {
//重新计时
if (countDownTimer !=null) {
countDownTimer.cancel();
}
//初始化CountTimer,设置倒计时时间
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中代码有点乱,懒得改了,着急总结完下班 -.- ! 有注释,相信差不多都能看懂
可以在onReceive回调中,进行处理自己想要的。我这边是弹出一个popupwindow,里面有一个seekbar,根据音量调节,seekbar进行滑动。
还有一个五秒消失seekbar,当音量发生改变,倒计时重新计时。
清单文件:
android:name=".receiver.MediaButtonIntentReciever"
android:permission="android.permission.RECEIVE_VOLUME_CHANGED_ACTION"
android:enabled="true"
android:exported="true">
首先在清单文件注册。
因为是全局监听的,所以我这边是直接在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回调中分别调用注册和注销广播方法。
有一个问题,就是系统自己的音量调节提示框也会展示,所以还需要在baseActivity中,添加一段代码:
//调节音量时,不展示系统音量进度条
@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中调大调小音量,系统的音量提示框不展示,自己的seekbar展示音量提醒。
没法加效果视频 - - !