随着当前IPTV EPG 技术的广泛应用,从机顶盒EPG 直播、点播界面拉起android 第三方apk时遇到的问题也越来越多,背景音的问题就是其中一个。
目前某些省份的机顶盒是这样,EPG拉起android 第三方 apk后, EPG的视频播放并没有pause掉。虽然EPG变成后台运行,第三方apk在前台运行,用户已经看不到视频画面,但是EPG 音频依然存在。用户在使用第三方app时会觉得聒噪。 遇到这种情况,要么EPG app 修改,要么第三方app修改,显然让已上线的EPG 方修改是不现实的。 那么第三方app怎么改呢?本人有幸遇到这个问题,下面是具体的解决办法:
一、怎样设置、取消静音
本人在作为第三方app的开发者在解决这个问题时,先后想到两种方法:
new Thread(new Runnable() {
@Override
public void run() {
try {
// 创建一个Instrumentation对象
Instrumentation inst = new Instrumentation();
// 调用inst对象的按键模拟方法
inst.sendKeyDownUpSync(KeyEvent.Mute);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
2. 强制在代码里设置静音
protected void muteAudio(boolean bMute) {
AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
int volume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
if (bMute && volume > 0) {
am.setStreamMute(AudioManager.STREAM_MUSIC, true); //设置静音
} else if(!bMute && volume == 0) {
am.setStreamMute(AudioManager.STREAM_MUSIC, false); //取消静音
}
}
这两种方法都能使得背景音消失,但是考虑到第一种方法有可能产生按键音, 所以最终用的第二种方法。
二、在哪里设置、取消静音
作为第三方app,并不是所有页面都要静音,有的页面是需要播放声音的,这个时候就要取消静音,返回后要继续设置静音,app退出时和app置于后台运行时要取消静音。
幸好本app内所有activity都继承于BaseActivity, 于是可以在这个BaseActivity里面设置静音和取消静音,不用分别到每个activity里面操作静音。相关代码如下:
@Override
protected void onResume() {
super.onResume();
muteAudio(true);
}
@Override
protected void onPause() {
super.onPause();
}
//当前应用是否处于前台
private boolean isForeground(Context context) {
if (context != null) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> processes = activityManager.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo processInfo: processes) {
if (processInfo.processName.equals(context.getPackageName())) {
if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
return true;
}
}
}
}
return false;
}
@Override
protected void onStop() {
super.onStop();
if(!isForeground(mContext)) { //当app被退出或者app被切到后台运行
muteAudio(false);
}
}
以上代码可以看出,只是在每个activity onResume调用时才设置静音,设置前判断音量是否为0,如果已经为0就不用设置; onPause 时不用取消静音,因为很可能好几个activity都不需要播放声音。如果某个操作确实需要播放声音,可以在具体activity里面取消静音。另外如果用户按home键将app切换到后台运行或者app退出,这是时候就要强制取消静音,所以可以在onStop里面调用取消静音。
后记
经过这次修改,发现将一个app里的所有activity全部继承于一个自定义的activity是非常必要的,一些统一的操作可以在这个BaseActivity里进行,譬如设置、取消静音,读取并显示系统时间,读取并显示网络状态等。