Android 7.0 在设置中新增加了充电提示音的打开选项,但打开后,插上充电线也是听不到充电音。根据查看代码可知,其实该充电提示音是指无线充电提示音。
PowerManagerService.java中updateIsPoweredLocked函数中,
if (dockedOnWirelessCharger) {
mNotifier.onWirelessChargingStarted();
}
下面我们添加正常充电方式的提醒音量。
frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.java
///导包@{
import android.media.RingtoneManager;
import android.media.Ringtone;
///}@
在private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) 中添加如下方法
else if (action.equals(Intent.ACTION_USER_UNLOCKED)) {
final int user = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, USER_NULL);
mConditionProviders.onUserUnlocked(user);
mListeners.onUserUnlocked(user);
mAssistants.onUserUnlocked(user);
mZenModeHelper.onUserUnlocked(user);
/// for charge sound@{
}else if (action.equals(Intent.ACTION_POWER_CONNECTED)){
final boolean enabled = Settings.Global.getInt(getContext().getContentResolver(),
Settings.Global.CHARGING_SOUNDS_ENABLED, 1) != 0;
final String soundPath = Settings.Global.getString(getContext().getContentResolver(),
Settings.Global.WIRELESS_CHARGING_STARTED_SOUND);
if (enabled && soundPath != null) {
final Uri soundUri = Uri.parse("file://" + soundPath);
if (soundUri != null) {
final Ringtone sfx = RingtoneManager.getRingtone(getContext(), soundUri);
if (sfx != null) {
sfx.setStreamType(AudioManager.STREAM_SYSTEM);
sfx.play();
}
}
}
}
///}@
public void onStart() { //在方法中添加如下方法
filter.addAction(Intent.ACTION_USER_STOPPED);
filter.addAction(Intent.ACTION_USER_SWITCHED);
/// for charge sound@{
filter.addAction(Intent.ACTION_POWER_CONNECTED);
///}@
filter.addAction(Intent.ACTION_USER_ADDED);
filter.addAction(Intent.ACTION_USER_REMOVED);
在2019年3月13日进行补充,在反复插拔充电器后可能会出现没有提示音的情况,解决办法如下:
02-14 17:03:04.144137 398 3781 E AudioFlinger: no more tracks available
02-14 17:03:04.144164 398 3781 E AudioFlinger_Threads: createTrack_l() initCheck failed -12; no control block?
Log显示Track的内存不够用了,问题原因是USB充电提示音每一次都创建一个Track,没有释放,导致内存不够用了。
/frameworks/base/services/core/java/com/android/server/power/Notifier.java添加成员变量:
private Ringtone mRingtone;
并把playChargingStartedSound函数的如下语句:
final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri);
if (sfx != null) {
sfx.setStreamType(AudioManager.STREAM_SYSTEM);
sfx.play();
}
改成:
final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri);
if(null != mRingtone){
mRingtone.stop();
}
mRingtone = sfx;
if (sfx != null) {
sfx.setStreamType(AudioManager.STREAM_SYSTEM);
sfx.play();
}