android/device/xxx/xxx/xxx.mk
android/frameworks/base/core/java/android/preference/RingtonePreference.java
android/frameworks/base/core/java/android/provider/Settings.java
android/frameworks/base/data/sounds/AllAudio.mk
android/frameworks/base/data/sounds/notifications/Mystery.mp3
android/frameworks/base/data/sounds/ringtones/VideoconJingle.ogg
android/frameworks/base/media/java/android/media/MediaScanner.java
android/frameworks/base/media/java/android/media/RingtoneManager.java
android/packages/apps/Mms/res/values/customize.xml
android/packages/apps/Mms/src/com/android/mms/ui/MessagingPreferenceActivity.java
android/packages/providers/MediaProvider/src/com/android/providers/media/RingtonePickerActivity.jav
PRODUCT_PROPERTY_OVERRIDES += \
ro.config.ringtone=VideoconJingle.ogg \
ro.config.notification_sound=Mystery.mp3 \
ro.config.notification_sound_2=Mystery.mp3 \
ro.config.notification_sound_3=Mystery.mp3 \
ro.config.sms_notification=pixiedust.ogg \
ro.config.alarm_alert=Alarm_Beep_01.ogg
mediaScanner.java 开机扫描手机所有多媒体文件(包括audio)等,
setDefaultRingtoneFileNames() 获取相关ro.config.* 属性值
public Uri doScanFile() 开始扫描并插入mediaprovider数据库中
xxx:/data/system/users/0 # ls
ls
appwidgets.xml runtime-permissions.xml settings_system.xml
package-restrictions.xml settings_global.xml wallpaper_info.xml
registered_services settings_secure.xml
设置多媒体文件的uri进 settings_system.xml配置文件中
如:<setting id="47" name="ringtone" value="content://media/internal/audio/media/191" package="com.android.providers.media" />
<setting id="48" name="ringtone_set" value="1" package="com.android.providers.media" />
private void setRingtoneIfNotSet(String settingName, Uri uri, long rowId) {
if (wasRingtoneAlreadySet(settingName)) {
return;
}
ContentResolver cr = mContext.getContentResolver();
String existingSettingValue = Settings.System.getString(cr, settingName);
if (TextUtils.isEmpty(existingSettingValue)) {
final Uri settingUri = Settings.System.getUriFor(settingName);
final Uri ringtoneUri = ContentUris.withAppendedId(uri, rowId);
RingtoneManager.setActualDefaultRingtoneUri(mContext,
RingtoneManager.getDefaultType(settingUri), ringtoneUri);
}
Settings.System.putInt(cr, settingSetIndicatorName(settingName), 1);
}
public static void setActualDefaultRingtoneUri(Context context, int type, Uri ringtoneUri) {
final ContentResolver resolver = context.getContentResolver();
String setting = getSettingForType(type); // "content://settings/system/ringtone"
if (setting == null) return;
Settings.System.putStringForUser(resolver, setting,
ringtoneUri != null ? ringtoneUri.toString() : null, context.getUserId());
}
public boolean putStringForUser(ContentResolver cr, String name, String value,
final int userHandle) {
try {
Bundle arg = new Bundle();
arg.putString(Settings.NameValueTable.VALUE, value);
arg.putInt(CALL_METHOD_USER_KEY, userHandle);
IContentProvider cp = lazyGetProvider(cr);
cp.call(cr.getPackageName(), mCallSetCommand, name, arg);
} catch (RemoteException e) {
Log.w(TAG, "Can't set key " + name + " in " + mUri, e);
return false;
}
return true;
}