从 Android 静音看正确的查bug的姿势?

0、写在前面

没抢到小马哥的红包,无心回家了,回公司写篇文章安慰下自己TT。。话说年关难过,bug多多,时间久了难免头昏脑热,不辨朝暮,难识乾坤。。。艾玛,扯远了,话说谁没踩过坑,可视大家都是如何从坑里爬出来的呢?

1、实现个静音的功能

话说,有那么一天,

PM:『我这里有个需求,很简单很简单那种』

RD:『哦,需要做三天』

PM:『真的很简单很简单那种』

RD:『哦,你又说了一遍很简单,那么现在需要做六天了』

对呀,静音功能多简单,点一下,欸,静音了;再点一下,欸,不静音了;再点一下,欸。。。

我一看API,是挺简单的:

private void setMuteEnabled(boolean enabled){
AudioManager mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, enabled);
}

是吧,多简单,三分钟搞定。不过说真的,这并不是什么好兆头,太简单了,简单到令人窒息啊!

2、『您好,我是京东快递,您有一个bug签收一下』

话说,过了几天,

QA:『如果我先开启静音,然后退出我们的app再进来,尽管页面显示静音状态,但我无法取消静音啊』

RD:『一定是你的用法有问题!』

当然,我也挺心虚的啊,因为这段代码我总共花了三分钟,说有bug,我也不敢不信呐。我们再来细细把刚才的场景理一遍:

  1. 打开app,开启静音
  2. 点击返回键,直到app进入后台运行
  3. 重新点击app的icon,启动app,此时期望app中的静音按钮显示为静音开启的状态,并且点击可以取消静音。当然,实际上并不是这样 (|_|)

有个问题需要交代一下,Android api并没有提供获取当前音频通道是否静音的api(为什么没有?你。。你居然问我为什么?你为什么这么着急?往后看就知道啦),所以我在进入app加载view时,要根据本地存储的静音状态来初始化view的状态:

boolean persistedMute = mute.getContext().getSharedPreferences("volume", Context.MODE_PRIVATE).getBoolean("Volume.Mute", false);
muteButton.setChecked(persistedMute);

而这个字段是在用户点击了muteButton之后被存入SharedPreference当中的。

不可能啊,到这里毫无悬念可言啊,肯定是没有问题的呀。

接着看,这时候我们要取消静音了,调用的代码就是下面这段代码:

private void setMuteEnabled(boolean enabled){
AudioManager mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, enabled);
}

然后,app一脸不屑的看都不看洒家一眼,依旧不吱声。

坑爹呢吧!!自行脑补我摔手机的场景

正是:自古bug多简单,惹得骚年尽难眠。

上一篇:Libgdx 开发指南——目录


下一篇:【Storm一】Storm安装部署