修改系统notification, ringtone, alarm:
在build/target/product/core.mk中添加
PRODUCT_PROPERTY_OVERRIDES :=
ro.config.alarm_alert=my_alarm.wav
ro.config.ringtone=my_ringtone.wav
ro.config.notification_sound=my_notification.wav
注意:alarm.wav必须位于/system/media/audio/alarms/目录下,
相应的ringtone.wav、notification.wav必须位于ringtones、notifications目录下。
(参考frameworks/base/data/sounds/AudioPackage2.mk)
PRODUCT_PROPERTY_OVERRIDES的设置,最终会在编译生成的out/target/product/generic/system/build.prop中添加相应属性:
ro.config.alarm_alert=my_alarm.wav
ro.config.ringtone=my_ringtone.wav
ro.config.notification_sound=my_notification.wav
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java:onCreate() > loadSettings() > loadSystemSettings()
设置了很多初始默认设置。
对于ro.config.ringtone,是在MediaScanner.java中设置的:
frameworks/base/media/java/android/media/MediaScanner.java
setDefaultRingtoneFileNames(),
endFile():
setSettingIfNotSet(Settings.System.NOTIFICATION_SOUND, tableUri, rowId);
frameworks/base/core/java/android/os/SystemProperties.java
frameworks/base/core/jni/android_os_SystemProperties.cpp
providers在何处被调用的?
SystemServer启动时
frameworks/base/services/java/com/android/server/SystemServer.java: run()
其中调用ActivityManagerService.installSystemProviders(),
最终会调用到frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/下
的各个content providers的onCreate()函数,初始化数据库内容
SD卡mount和umount时的声音:
对应ACTION_MEDIA_MOUNTED和ACTION_MEDIA_UNMOUNTED
MountService.java中的
notifyMediaMounted()会调用setMediaStorageNotification()向NotificationManager发通知,
其中设置了通知时的铃声为Notification.DEFAULT_SOUND,即系统默认铃声,
可以设置为自定义铃声:
mMediaStorageNotification.sound = Uri.parse(“file:///sdcard/notification/ringer.mp3”);
然后NotificationManager.java的notify(),调用NotificationManagerService的
enqueueNotificationWithTag()向队列中加新的notification
对应文件为:
frameworks/base/services/java/com/android/server/MountService.java
frameworks/base/core/java/android/app/NotificationManager.java
frameworks/base/services/java/com/android/server/NotificationManagerService.java
对于其他ACTION,如ACTION_POWER_CONNECTED、ACTION_POWER_DISCONNECTED,方法应当类似。
Dialer数字键盘按键声:
ToneGenerator.java中定义了一系列声音,Dialer拨号数字键盘使用的就是这里定义的声音。
(frameworks/base/media/java/android/media/ToneGenerator.java)
在frameworks/base/media/libmedia/ToneGenerator.cpp中,定义了数字键盘的发声参数,包括频率等。
按音量键(VolumeUp,VolumeDown)的声音:
frameworks/base/core/java/android/view/VolumePanel.java
onPlaySound()函数中调用ToneGenerator的startTone()播放,和Dialer的数字键盘的实现一样。
Settings > 声音和显示设置 > 调节ringtone/media音量:
frameworks/base/core/java/android/preference/VolumePreference.java
在initSeekBar()中会根据StreamType选择调节音量时播放的音频文件,为下列三者之一:
Settings.System.DEFAULT_RINGTONE_URI
Settings.System.DEFAULT_NOTIFICATION_URI
Settings.System.DEFAULT_ALARM_ALERT_URI
其中Settings在frameworks/base/core/java/android/provider/Setting.java
QWERT键盘按键声:
frameworks/base/media/java/android/media/AudioService.java
修改 SOUND_EFFECT_FILES 可自定义QWERT键盘点击时的声音
private static final String SOUND_EFFECTS_PATH = “/media/audio/ui/“;
private static final String[] SOUND_EFFECT_FILES = new String[] {
“Effect_Tick.ogg”,
“KeypressStandard.ogg”,
“KeypressSpacebar.ogg”,
“KeypressDelete.ogg”,
“KeypressReturn.ogg”
};
注意:音频文件必须在/media/audio/ui/目录之下。
系统电量低时的通知:
frameworks/base/services/java/com/android/server/status/StatusBarPolicy.java
showLowBatteryWarning()
end