1. 程式人生 > >Android系統修改預設鈴聲

Android系統修改預設鈴聲

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;
                }
            }
這裡看到寫入了資料庫中。

 

轉自:https://blog.csdn.net/androidfish/article/details/30742565