Android音频相关(一)插入耳机后调节音量(安全音量)

一、安全音量提醒框的开启

二、修改安全音量提醒框显示

三、重启后还会显示安全音量提醒框

四、一些关于安全音量的初始值

一、安全音量提醒框的开启

安卓系统是有耳机音量保护机制的,对于一些出口欧盟的手机来说,这个提醒是必须存在的。当然安卓系统也是有这个功能的。我们下面就来简单介绍一下

frameworks/base/services/core/java/com/android/server/audio/AudioService.java

 private void onConfigureSafeVolume(boolean force, String caller) {
      
               ///modify by xiangzaixiansheng for @{
              ///这个主要是修改下面的布尔值为true;
                boolean safeMediaVolumeEnabled =
                        SystemProperties.getBoolean("audio.safemedia.force", true)
                        || mContext.getResources().getBoolean(
                                com.android.internal.R.bool.config_safe_media_volume_enabled);
               ///}@
               
}

对于提醒的安全音量值来说

frameworks/base / core/res/res/values/config.xml

 <!--安全音量值-->
<integer name="config_safe_media_volume_index">8</integer>
 
 <!-- Whether safe headphone volume is enabled or not (country specific). -->
 <!--这个值也需要是true才可以-->
  <bool name="config_safe_media_volume_enabled">true</bool>

二、修改安全音量提醒框显示

在安卓原生的逻辑中,达到安全音量后,如果再增加音量,安全音量提醒框会消失。这样其实不太符合欧盟国家的要求。所以简单修改成,用户必须点击确认,才能消失安全音量提醒框。

/frameworks/base/packages/SystemUI/src/com/android/systemui/volume/SafetyWarningDialog.java

 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");
            //modify by xiangzaixiansheng @{
            //mAudioManager.disableSafeMediaVolume();
            //dismiss();
            ///}@
        }
        return super.onKeyUp(keyCode, event);
    }

三、重启后还会显示安全音量提醒框

1: 可以在 AudioService.java 的构造方法中设个变量, 比如 bool bIsFirstBoot = true;

2: 然后在 checkSafeMediaVolume 方法中, 判断此变量, 如下:

frameworks/base/services/core/java/com/android/server/audio/AudioService.java

private boolean checkSafeMediaVolume(int streamType, int index, int device) {
synchronized (mSafeMediaVolumeState) {
//add begin
 
if(bIsFirstBoot){
mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE;
bIsFirstBoot = false;
}
//add ends
if ((mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) &&
(mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) &&
((device & mSafeMediaVolumeDevices) != 0) &&
(index > mSafeMediaVolumeIndex)) {
return false;
}
return true;
}
}

四、一些关于安全音量的初始值

public class AudioService extends IAudioService.Stub {
    // mSafeMediaVolumeState 当前媒体音量是否被限制的状态标识.
    // 设备启动时为 SAFE_MEDIA_VOLUME_NOT_CONFIGURED. 
    // 根据国家不同或是 SAFE_MEDIA_VOLUME_ACTIVE 或是 SAFE_MEDIA_VOLUME_DISABLED.
    // 当用户确认过后会调用 disableSafeMediaVolume() 设为 SAFE_MEDIA_VOLUME_INACTIVE.
    private static final int SAFE_MEDIA_VOLUME_NOT_CONFIGURED = 0;
    private static final int SAFE_MEDIA_VOLUME_DISABLED = 1;
    private static final int SAFE_MEDIA_VOLUME_INACTIVE = 2;
    private static final int SAFE_MEDIA_VOLUME_ACTIVE = 3;
    private Integer mSafeMediaVolumeState;
    // Mobile country code,这里主要用来区分国家
    private int mMcc = 0;
    // 安全音量值
    private int mSafeMediaVolumeIndex;
    // mSafeMediaVolumeDevices 强制开启SafeVolume的输出设备(耳机)
    private final int mSafeMediaVolumeDevices = AudioSystem.DEVICE_OUT_WIRED_HEADSET |
                                                AudioSystem.DEVICE_OUT_WIRED_HEADPHONE;
    // mMusicActiveMs 在禁用SafeVolume下的使用耳机的累计时长.
    // 当累计达到 UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX 时会自动开启SafeVolume
    private int mMusicActiveMs;
    private static final int UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX = (20 * 3600 * 1000); // 20 hours
    private static final int MUSIC_ACTIVE_POLL_PERIOD_MS = 60000;  // 1 minute polling interval
    private static final int SAFE_VOLUME_CONFIGURE_TIMEOUT_MS = 30000;  // 30s after boot completed
    ...
private void onConfigureSafeVolume(boolean force, String caller) {
    synchronized (mSafeMediaVolumeState) {
        int mcc = mContext.getResources().getConfiguration().mcc;
        if ((mMcc != mcc) || ((mMcc == 0) && force)) {
            // 从 values 中获取具体的安全音量阈值
            mSafeMediaVolumeIndex =  mContext.getResources().getInteger(com.android.internal.R.integer.config_safe_media_volume_index) * 10;
            boolean safeMediaVolumeEnabled =  SystemProperties.getBoolean("audio.safemedia.force", false) || mContext.getResources().getBoolean(com.android.internal.R.bool.config_safe_media_volume_enabled);
            boolean safeMediaVolumeBypass =                     SystemProperties.getBoolean("audio.safemedia.bypass", false);
            // persitedSate 只会是 "disabled" 或者 "active",这个变量值作用于下次启动且不能是 "inactive"
            int persistedState;
            if (safeMediaVolumeEnabled && !safeMediaVolumeBypass) {
                persistedState = SAFE_MEDIA_VOLUME_ACTIVE;
                // 有可能在这个方法被调用之前用户已经设为"inactive"了.
                if (mSafeMediaVolumeState != SAFE_MEDIA_VOLUME_INACTIVE) {
                    if (mMusicActiveMs == 0) {
                        mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE;
                        // 降低音量到安全阈值
                        enforceSafeMediaVolume(caller);
                    } else {
                        // 用户已经过确认
                        mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_INACTIVE;
                    }
                }
            } else {
                persistedState = SAFE_MEDIA_VOLUME_DISABLED;
                mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_DISABLED;
            }
            mMcc = mcc;
            // 发送保存 persistedState 的消息
            sendMsg(mAudioHandler,
                    MSG_PERSIST_SAFE_VOLUME_STATE,
                    SENDMSG_QUEUE,
                    persistedState,
                    0,
                    null,
                    0);
        }
    }
}

 


---------------------
作者:祥仔先生
来源:CSDN
原文:https://blog.csdn.net/xiangzaixiansheng/article/details/88620146
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android操作系统提供了丰富的音量调节功能,使用户可以根据自己的需求和环境来调节设备的音量。 首先,用户可以通过音量按钮来快速调节设备的音量。通过按下设备的音量上下按钮,可以分别提高或降低音量。这种方式非常方便,用户可以根据需要快速调整音量大小。 除了音量按钮,用户还可以通过系统设置来进一步调节音量。用户可以打开“设置”应用,找到“声音”或“音量”选项。在该选项中,用户可以分别设置媒体、通知、来电、闹钟等不同的音量,并使用滑块来调整音量的大小。 另外,Android还提供了快捷菜单来调节音量。用户可以从屏幕顶部或底部向上或向下滑动,从而打开快捷菜单。在该菜单中,用户可以找到音量控制选项,并通过滑块来调整音量大小。这种方式比较便捷,用户可以在任何应用中快速调节音量,而无需进入设置。 最后,有些应用还提供了自定义音量调节功能。例如,音乐播放器应用通常会提供独立的音量控制,用户可以在应用内部调整音量,而不影响其他应用的音量设置。这种方式适用于一些需要专注调整音乐或媒体音量的场景。 总之,Android提供了多种方法来调节音量,包括通过音量按钮、系统设置、快捷菜单和应用自定义等方式。用户可以根据需要和偏好自由地调整设备的音量大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值