当前位置: 首页 > 工具软件 > epg for iptv > 使用案例 >

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

景高杰
2023-12-01

随着当前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里进行,譬如设置、取消静音,读取并显示系统时间,读取并显示网络状态等。

 类似资料: