轉載自:https://blog.csdn.net/androidfish/article/details/30742565
Andriod手機的鈴聲默認保存在system/media/audio/下面,有四個文件夾,分別是alarms,notifications,ringtones,ui。對應鬧鐘、通知、鈴聲、UI音效。root的手機可以直接替換修改相應目錄下的文件來修改鈴聲。那這些聲音是從哪裏來的呢。由於需要修改默認的鈴聲,就讀了一下源碼,這裏進行記錄一下。
在源碼中,這些文件保存在frameworks\base\data\sounds目錄下面,通過修改相應的mk文件把這些聲音文件放到手機的相應目錄。手機啓動後會調用媒體庫對手機內外存儲上的多媒體文件進行掃描,保存其URI到媒體庫的數據庫中。當設置鈴聲時,會調用媒體庫的(mediaProvider)RingtonePickerActivity進行設置。這裏鈴聲Uri保存在數據庫中,通過媒體庫掃描出來顯示個列表供選擇。默認鈴聲的URI保存在設置(Settings)的數據庫中,在表system裏面。
修改默認鈴聲
修改mk文件,ro.config.ringtone對應手機默認鈴聲,ro.config.alarm_alert對應鬧鐘默認鬧鈴,ro.config.notification_sound設置通知默認響鈴。我這裏修改的是/build/target/product/full_base.mk,編譯的時候這些值會被編到 build.prop內。
PRODUCT_PROPERTY_OVERRIDES := \
ro.config.ringtone=yami_style1.ogg \
ro.config.alarm_alert=Alarm_Rooster_02.ogg \
ro.config.notification_sound=yami_notification.ogg
在MediaScanner.java中讀取並保存配置到設置裏面。
private static final String DEFAULT_RINGTONE_PROPERTY_PREFIX = "ro.config.";
private void setDefaultRingtoneFileNames() {
mDefaultRingtoneFilename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX
+ Settings.System.RINGTONE);
mDefaultNotificationFilename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX
+ Settings.System.NOTIFICATION_SOUND);
mDefaultAlarmAlertFilename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX
+ Settings.System.ALARM_ALERT);
}
...
if (TextUtils.isEmpty(mDefaultRingtoneFilename) ||
doesPathHaveFilename(entry.mPath, mDefaultRingtoneFilename)) {
needToSetSettings = true;
}
...
if(needToSetSettings) {
if (notifications) {
setSettingIfNotSet(Settings.System.NOTIFICATION_SOUND, tableUri, rowId);
mDefaultNotificationSet = true;
} else if (ringtones) {
setSettingIfNotSet(Settings.System.RINGTONE, tableUri, rowId);
if (MSimTelephonyManager.getDefault().isMultiSimEnabled()) {
// Set the setting to the given URI for RINGTONE_2
setSettingIfNotSet(Settings.System.RINGTONE_2, tableUri, rowId);
}
mDefaultRingtoneSet = true;
} else if (alarms) {
setSettingIfNotSet(Settings.System.ALARM_ALERT, tableUri, rowId);
mDefaultAlarmSet = true;
}
}
這裏看到寫入了數據庫中。