第三方App 如何停掉IPTV EPG 背景音

隨着當前IPTV EPG 技術的廣泛應用,從機頂盒EPG 直播、點播界面拉起android 第三方apk時遇到的問題也越來越多,背景音的問題就是其中一個。

 

目前某些省份的機頂盒是這樣,EPG拉起android 第三方 apk後, EPG的視頻播放並沒有pause掉。雖然EPG變成後臺運行,第三方apk在前臺運行,用戶已經看不到視頻畫面,但是EPG 音頻依然存在。用戶在使用第三方app時會覺得聒噪。 遇到這種情況,要麼EPG app 修改,要麼第三方app修改,顯然讓已上線的EPG 方修改是不現實的。 那麼第三方app怎麼改呢?本人有幸遇到這個問題,下面是具體的解決辦法:

 

一、怎樣設置、取消靜音

本人在作爲第三方app的開發者在解決這個問題時,先後想到兩種方法:

  1. 模擬發送靜音鍵
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裏進行,譬如設置、取消靜音,讀取並顯示系統時間,讀取並顯示網絡狀態等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章