隨着當前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裏進行,譬如設置、取消靜音,讀取並顯示系統時間,讀取並顯示網絡狀態等。