屏蔽某个Android按键音
事情是这样子的,有个客户提了个bug,设备在佩戴的状态发生改变的时候,不要发出声音。
我们的佩戴检测是以按键事件上传到上层应用的。
那怎么样找到修改的地方呢?一行一行去读代码,肯定不科学。
按键音的播放
AudioManager.playSoundEffect(effectType);
知道这个以后,可以抛异常嘛
于是
public void playSoundEffect(int effectType) {
Log.e(TAG, "effectType == > " + effectType);
//add by TrillGates to test
try{
int i = 10/0;
}catch(Exception e){
e.printStackTrace();
}
if (effectType < 0 || effectType >= NUM_SOUND_EFFECTS) {
return;
}
if (!querySoundEffectsEnabled()) {
return;
}
IAudioService service = getService();
try {
service.playSoundEffect(effectType);
} catch (RemoteException e) {
Log.e(TAG, "Dead object in playSoundEffect"+e);
}
}
这样抛个异常,然后自己try住,不就可以知道调用栈了吗?
//add by TrillGates to test
try{
int i = 10/0;
}catch(Exception e){
e.printStackTrace();
}
触发佩戴检测
log输出
W/System.err: java.lang.ArithmeticException: divide by zero
08-02 22:18:19.656 682-741/system_process W/System.err: at android.media.AudioManager.playSoundEffect(AudioManager.java:1798)
08-02 22:18:19.656 682-741/system_process W/System.err: at com.android.internal.policy.impl.PhoneWindowManager.interceptKeyBeforeQueueing(PhoneWindowManager.java:4631)
08-02 22:18:19.656 682-741/system_process W/System.err: at com.android.server.wm.InputMonitor.interceptKeyBeforeQueueing(InputMonitor.java:362)
08-02 22:18:19.656 682-741/system_process W/System.err: at com.android.server.input.InputManagerService.interceptKeyBeforeQueueing(InputManagerService.java:1341)
08-02 22:18:19.656 682-741/system_process W/System.err: at dalvik.system.NativeStart.run(Native Method)
所以,代码是从PhoneWindowManager.java:4631调过来的。
修改
原代码:
AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN);
因为我的按键号是141,所以我修改,并且加上注释,解决某个bug即可。
//by TrillGates
//这里面是播放按键音的
//这里而屏蔽掉141这个按键音
//这个是佩戴检测的按键音
if(keyCode!=KeyEvent.KEYCODE_F11){
AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN);
}
到这里就可以了,编译,刷机,测试。