安卓原始碼音量調節服務分析
阿新 • • 發佈:2021-06-22
記一次設定音量調節的原始碼分析:
調節音量一般在設定裡面,於是找到了設定頁面的原始碼:SettingsActivity
@VisibleForTesting void launchSettingFragment(String initialFragmentName, Intent intent) { if (initialFragmentName != null) { setTitleFromIntent(intent); Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS); switchToFragment(initialFragmentName, initialArguments,true, mInitialTitleResId, mInitialTitle); } else { // Show search icon as up affordance if we are displaying the main Dashboard mInitialTitleResId = R.string.dashboard_title; switchToFragment(TopLevelSettings.class.getName(), null /* args*/, false, mInitialTitleResId, mInitialTitle); } }
然後進入到TopLevelSettings
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider(R.xml.top_level_settings) { @Override protectedboolean isPageSearchEnabled(Context context) { // Never searchable, all entries in this page are already indexed elsewhere. return false; } };
再進入top_level_settings
<Preference android:key="top_level_sound" android:title="@string/sound_settings" android:summary="@string/sound_dashboard_summary" android:icon="@drawable/ic_homepage_sound" android:order="-70" android:fragment="com.android.settings.notification.SoundSettings"/>
進入SoundSettings
@Override protected int getPreferenceScreenResId() { return R.xml.sound_settings; }
進入sound_settings
<!-- Ring volume --> <com.android.settings.notification.VolumeSeekBarPreference android:key="ring_volume" android:icon="@drawable/ic_notifications" android:title="@string/ring_volume_option_title" android:order="-160" settings:controller="com.android.settings.notification.RingVolumePreferenceController"/>
進入RingVolumePreferenceController
private void updateRingerMode() { final int ringerMode = mHelper.getRingerModeInternal(); if (mRingerMode == ringerMode) return; mRingerMode = ringerMode; updatePreferenceIcon(); }
進入AudioHelper
public int getRingerModeInternal() { return mAudioManager.getRingerModeInternal(); }
進入frameworks/base/media/java/android/media/AudioManager
@UnsupportedAppUsage public int getRingerModeInternal() { try { return getService().getRingerModeInternal(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } }
進入getService方法
@UnsupportedAppUsage private static IAudioService getService() { if (sService != null) { return sService; } IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE); sService = IAudioService.Stub.asInterface(b); return sService; }
進入frameworks/base/media/java/android/media/IAudioService.aidl
int getRingerModeInternal();
進入frameworks/base/services/core/java/com/android/servicer/audio/AudioService
public class AudioService extends IAudioService.Stub implements AccessibilityManager.TouchExplorationStateChangeListener, AccessibilityManager.AccessibilityServicesStateChangeListener {
進入方法getRingerModeInternal
@Override public int getRingerModeInternal() { synchronized(mSettingsLock) { return mRingerMode; } }
可以看到音量的調節是有這個mRingerMode來控制
private void readPersistedSettings() { if (!mSystemServer.isPrivileged()) { return; } final ContentResolver cr = mContentResolver; int ringerModeFromSettings = Settings.Global.getInt( cr, Settings.Global.MODE_RINGER, AudioManager.RINGER_MODE_NORMAL); int ringerMode = ringerModeFromSettings; // sanity check in case the settings are restored from a device with incompatible // ringer modes if (!isValidRingerMode(ringerMode)) { ringerMode = AudioManager.RINGER_MODE_NORMAL; } if ((ringerMode == AudioManager.RINGER_MODE_VIBRATE) && !mHasVibrator) { ringerMode = AudioManager.RINGER_MODE_SILENT; } if (ringerMode != ringerModeFromSettings) { Settings.Global.putInt(cr, Settings.Global.MODE_RINGER, ringerMode); } if (mUseFixedVolume || mIsSingleVolume) { ringerMode = AudioManager.RINGER_MODE_NORMAL; } synchronized(mSettingsLock) { mRingerMode = ringerMode; if (mRingerModeExternal == -1) { mRingerModeExternal = mRingerMode; }