当前标签 / AudioManager / 总共2篇

关于视频播放 VideoView 的一个 GC 问题

这段时间在一个项目中用到了视频和图片轮播的广告,一开始我使用了 ExoPlayer 视频播放库,结果出现了一个奇葩的问题 ANR on player release #4352,我的设备系统是 Android 5.1.1 于是我尝试工程更新到 AndroidX 将 ExoPlayer 更新到最新版本,结果还是会出问题,貌似在 Android 7.0 中这个问题得到了修复。迫于这个问题的困扰,于是我放弃了 ExoPlayer 而选择系统默认的视频播放库,结果遇到了另一个令人不爽的 bug bug 详细描述

这个问题在更高的 Android 系统中已经被修复 Fix context leak

最后变相解决 VideoView 在 Activity 中内存泄漏的方法:

创建 AudioServiceActivityLeak.java 类:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * Fixes a leak caused by AudioManager using an Activity context. 
 * Tracked at https://android-review.googlesource.com/#/c/140481/1 and
 * https://github.com/square/leakcanary/issues/205
 */
public class AudioServiceActivityLeak extends ContextWrapper {

  AudioServiceActivityLeak(Context base) {
    super(base);
  }

  public static ContextWrapper preventLeakOf(Context base) {
    return new AudioServiceActivityLeak(base);
  }

  @Override public Object getSystemService(String name) {
    if (Context.AUDIO_SERVICE.equals(name)) {
      return getApplicationContext().getSystemService(name);
    }
    return super.getSystemService(name);
  }
}

在使用 VideoView 的 Activity 中重写 attachBaseContext

1
2
3
4
5
6
public class ActivityUsingVideoView extends Activity {
  
  @Override protected void attachBaseContext(Context base) {
    super.attachBaseContext(AudioServiceActivityLeak.preventLeakOf(base));
  }
}

阅读更多

Android中系统音量用代码控制

音量调节

我们知道,在平常调节音量的时候,是有一定的调节数值,也就是,每按一次音量 +/-,音量的增加/减小幅度,这个我们称为:系统的音量步进值。而音量还有一定的范围,系统的是:0 到 Max,Max 不确定,这个称为:系统的音量范围。

在Android中,是有几种类型的音量可以调节:

  • STREAM_ALARM 警报
  • STREAM_MUSIC 音乐回放即媒体音量
  • STREAM_RING 铃声
  • STREAM_SYSTEM 系统
  • STREAM_VOICE_CALL 通话

Android 中的所有音量都是通过:AudioManager 去管理的,也是通过它去调节:

1
2
3
4
5
6
//获取系统的Audio管理者
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);  
//最大音量
int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
//当前音量
int currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

阅读更多