【Framework】插入耳机时安全音量提示
2018-03-10 21:38
260 查看
插入耳机的状态下,当音量达到某个值得时候,会弹出一个“继续提高音量将损害听力”的提示框。这只是一普通的对话框而已,但是这与需求不太一样,需要做一些微微的调整。
现在我们知道它是通过AIDL来调用远程Service中的
因此我们可以看到一个继承了
重点看
略囧,看到这里,后面的一些代码看了很久,着实没看懂了,其实主要纠结的一点在于:点击确认按钮后,以后再调到临界音量的时候,它并不会弹窗,我很自然地想,这个应该是保存到了SharedPreference里面,但是保存该项状态的语句之后一处,然后由那一处,一直往上找,看它是什么时候保存的,结果找到了一个死胡同,出不去了。感觉自己对音量调节这一块知道的还是有点少,需要进一步学习这方面的东西,才看得懂。虽然网上有一些已经对这个做过分析的文章,也仔细阅读过,但是无奈源码的版本不一样,本着思想应该大致不会变的想法,我还是继续去寻找。
源码的目录:
Android 8.0中,位于:frameworks/base/packages/SystemUI/src/com/android/systemui/volume/SafetyWarningDialog.java
大致分析
正如之前想的那样,它确实只是一个普通的Dialog,但是继承自
SystemUIDialog,它只是对
AlertDialog做了一些封装。
@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) { // 如果再按一次音量+,并且不是第一次按,那么对话框的时间有1s // 就可以继续调节音量 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确认后做了哪些具体的事情
// AudioManager.java public void disableSafeMediaVolume() { try { getService().disableSafeMediaVolume( mApplicationContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } // 这是一个很典型的AIDL的应用,获取与远程服务的连接; // 然后调用远程服务的disableSafeMediaVolume()方法。 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里面,但是保存该项状态的语句之后一处,然后由那一处,一直往上找,看它是什么时候保存的,结果找到了一个死胡同,出不去了。感觉自己对音量调节这一块知道的还是有点少,需要进一步学习这方面的东西,才看得懂。虽然网上有一些已经对这个做过分析的文章,也仔细阅读过,但是无奈源码的版本不一样,本着思想应该大致不会变的想法,我还是继续去寻找。
相关文章推荐
- Android 收音机音量开到最大都没有“将音量调高到安全级别以上?会损坏听力”提示
- 电脑右下角小喇叭图标红叉提示未插入扬声器或者耳机
- 实现FM在无耳机插入时退出后有弹出框提示及其样式
- 解决win10台式机插入耳机没有声音或者音量不大
- windows7无声音,提示扬声器、耳机未插入的解决办法!电脑右下角喇叭显示未插入扬声器或耳机怎么解决!
- windows7无声音,提示未插入扬声器或耳机的解决
- FAQ08356][Audio Volume]来电\闹钟\短信提示\铃声预览\拍照音等,在播放过程中插入或者拔出耳机,外放中的铃声音异常
- 小技巧:设置电脑的外放喇叭音量和插入耳机时音量不一样
- 功能:插入耳机,提示打开与耳机相关的app
- windows7无声音,提示未插入扬声器或耳机的解决办法
- windows7无声音,提示未插入扬声器或耳机的解决
- 插入耳机,先按音量键,再预览铃声的时候正常;但先预览铃声再按音量键的时候,音量偏大。
- android开发之耳机调至最大音量时,提示损伤听力
- mt6735 [Audio App]未插入耳机时进入收音机出现没有耳机提示框后,插入耳机FM能够自动播放
- WIN7 通知栏处喇叭上有个小红叉,提示未插入“未插入扬声器或耳机”的解决方法
- Win10系统取消插入耳机后弹出的SmartAudio提示的方法
- sql 插入含有主键的列,提示:你没有该列的权限限制的解决方法
- 如何不让IE提示——当前安全设置会使计算机有风险
- 发掘ListBox的潜力(二):鼠标拖放插入点提示
- sql insert语句进入插入操作时,遇到插入失败但又没有提示信息时的个人原因