android5.0设置模块音量调节流程

最近刚好修改到相关方面的BUG,在这里整理总结一下。
设置中音量相关的Fragment调整到了NotificationSettings.java中。
我们可以在R.xml.notification_settings中看到如下

        <!-- Media volume -->
        <com.android.settings.notification.VolumeSeekBarPreference
                android:key="media_volume"
                android:icon="@drawable/ic_audio_vol_24dp"
                android:title="@string/media_volume_option_title" />

        <!-- Alarm volume -->
        <com.android.settings.notification.VolumeSeekBarPreference
                android:key="alarm_volume"
                android:icon="@drawable/ic_audio_alarm_24dp"
                android:title="@string/alarm_volume_option_title" />

        <!-- Ring volume -->
        <com.android.settings.notification.VolumeSeekBarPreference
                android:key="ring_volume"
                android:icon="@drawable/ring_notif"
                android:title="@string/ring_volume_option_title" />

        <!-- Notification volume -->
        <com.android.settings.notification.VolumeSeekBarPreference
                android:key="notification_volume"
                android:icon="@drawable/ring_notif"
                android:title="@string/notification_volume_option_title" />

这分别代表多媒体、闹钟、来电铃声和系统通知音量。所以在UI层面上用户是通过调节VolumeSeekBarPreference这个seekbar来最终对系统音量进行调整。
回头看NotificationSettings.java中初始化流程

    //sound是包含上面4个SeekBar的PreferenceCategory
    final PreferenceCategory sound = (PreferenceCategory) findPreference(KEY_SOUND);
        initVolumePreference(KEY_MEDIA_VOLUME, AudioManager.STREAM_MUSIC);
        initVolumePreference(KEY_ALARM_VOLUME, AudioManager.STREAM_ALARM);
    //判断是否支持通话,支持移除NOTIFICATION_VOLUME否则移除RING_VOLUME
        if (mVoiceCapable) {
            mRingOrNotificationPreference =
                    initVolumePreference(KEY_RING_VOLUME, AudioManager.STREAM_RING);
            sound.removePreference(sound.findPreference(KEY_NOTIFICATION_VOLUME));
        } else {
            mRingOrNotificationPreference =
                    initVolumePreference(KEY_NOTIFICATION_VOLUME, AudioManager.STREAM_NOTIFICATION);
            sound.removePreference(sound.findPreference(KEY_RING_VOLUME));
        }
        initRingtones(sound);

    private final VolumePreferenceCallback mVolumeCallback = new VolumePreferenceCallback();

    private VolumeSeekBarPreference initVolumePreference(String key, int stream) {
        final VolumeSeekBarPreference volumePref = (VolumeSeekBarPreference) findPreference(key);
    设置callback
        volumePref.setCallback(mVolumeCallback);
    //设置AudioManager的stream,可以在AudioSystem中看到具体int值代表的意义
        volumePref.setStream(stream);
        return volumePref;
    }

mVolumeCallback如下,当你拖动seekbar对音量进行调节时这个callback会回馈响应,在界面上进行相应的调整。

private final class VolumePreferenceCallback implements VolumeSeekBarPreference.Callback {
   
    //SeekBarVolumizer是主要负责对系统音量进行调整的类,会在后面描述
        private SeekBarVolumizer mCurrent;

        @Override
        public void onSampleStarti
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值