插入耳机的状态下,当音量达到某个值得时候,会弹出一个“继续提高音量将损害听力”的提示框。这只是一普通的对话框而已,但是这与需求不太一样,需要做一些微微的调整。
源码的目录:
Android 8.0中,位于:
frameworks/base/packages/SystemUI/src/com/android/systemui/volume/SafetyWarningDialog.java
大致分析
正如之前想的那样,它确实只是一个普通的Dialog
,但是继承自SystemUIDialog
,它只是对AlertDialog
做了一些封装。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && event.getRepeatCount() == 0) { mNewVolumeUp = true; } return super.onKeyDown(keyCode, event); }
@Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && mNewVolumeUp && (System.currentTimeMillis() - mShowTime) > KEY_CONFIRM_ALLOWED_AFTER) { if (D.BUG) Log.d(TAG, "Confirmed warning via VOLUME_UP"); mAudioManager.disableSafeMediaVolume(); dismiss(); } return super.onKeyUp(keyCode, event); }
@Override public void onClick(DialogInterface dialog, int which) { mAudioManager.disableSafeMediaVolume(); }
|
在什么情况下弹出提醒框
待补充ing
确认后做了哪些具体的事情
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public void disableSafeMediaVolume() { try { getService().disableSafeMediaVolume( mApplicationContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } }
private static IAudioService getService(){ if (sService != null) { return sService; } IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE); sService = IAudioService.Stub.asInterface(b); return sService; }
|
现在我们知道它是通过AIDL来调用远程Service中的disableSafeMediaVolume()
方法,所以现在应该要找到它的具体实现方法在哪里。想要实现该AIDL所定义的功能,肯定要创建一个类继承IAudioService.Stub
,然后实现该方法。

因此我们可以看到一个继承了IAudioService.Stub
的类,它的路径如下:base/services/core/java/com/android/server/audio/AudioService.java
,因此可以直接打开这个文件,具体的实现方法就在里面。如下:

重点看setSafeMediaVolumeEnabled(false, callingPackage);
因为它的名字看起来与我们想要看的功能十分接近。

mSafeMediaVolumeState
已经被置为SAFE_MEDIA_VOLUME_INACTIVE
。
略囧,看到这里,后面的一些代码看了很久,着实没看懂了,其实主要纠结的一点在于:点击确认按钮后,以后再调到临界音量的时候,它并不会弹窗,我很自然地想,这个应该是保存到了SharedPreference里面,但是保存该项状态的语句之后一处,然后由那一处,一直往上找,看它是什么时候保存的,结果找到了一个死胡同,出不去了。感觉自己对音量调节这一块知道的还是有点少,需要进一步学习这方面的东西,才看得懂。虽然网上有一些已经对这个做过分析的文章,也仔细阅读过,但是无奈源码的版本不一样,本着思想应该大致不会变的想法,我还是继续去寻找。