packages/apps/Settings/src/com/android/settings/audioprofile/Editprofile.java
private SwitchOnRingtonePreference mPowerOn;
private SwitchOffRingtonePreference mPowerOff; mPowerOn = (SwitchOnRingtonePreference) findPreference(KEY_SWITCH_ON_RINGTONE); if(mPowerOn != null){ mPowerOn.setProfile(key); if(silentMode){ parent.removePreference(mPowerOn); } } mPowerOff = (SwitchOffRingtonePreference) findPreference(KEY_SWITCH_OFF_RINGTONE); if(mPowerOff != null){ mPowerOff.setProfile(key); if(silentMode){ parent.removePreference(mPowerOff); } } (2)默认值的设置
代码 位置:
packages/apps/Settings/src/com/android/settings/audioprofile
/**
* Persist the values of All the profiles for their default status */
void initProfiles()
(3)SwitchOffRingtonePreference和SwitchOnRingtonePreference.java继承于RingtonePreference
代码 位置:
packages/apps/Settings/src/com/android/settings/SwitchOffRingtonePreference.java RingtonePreference中
mRingtoneType = a.getInt(com.android.internal.R.styleable.RingtonePreference_ringtoneType, RingtoneManager.TYPE_RINGTONE);
mShowDefault = a.getBoolean(com.android.internal.R.styleable.RingtonePreference_showDefault, true);
mShowSilent = a.getBoolean(com.android.internal.R.styleable.RingtonePreference_showSilent, true);
分别表示Ringtone类型,是否设置为默认,是否选择静音。 当在设置界面选中此设置项时,会调用
RingtoneManager.ACTION_RINGTONE_PICKER,弹出SwitchOff音效设置对话框,供用户选择
(4)在mediatek/source/frameworks/media/audio/java/com/mediatek/audioprofile/AudioProfile.java
中,
ArcherMind Inc. Proprietary – For Internal Use Only
CONFIDENTIAL Date
Page 21 of 33
需要添加
/**
* Type that refers to sounds that are used for the power on. *
* @see #getRingtoneUri(Context, int) * @see #setRingtoneUri(Context, int, Uri) */
public static final int TYPE_POWER_ON = 100; /**
* Type that refers to sounds that are used for the power off. *
* @see #getRingtoneUri(Context, int) * @see #setRingtoneUri(Context, int, Uri) */
public static final int TYPE_POWER_OFF = 101;
两种类型
(5)
mediatek/source/frameworks/media/audio/java/com/mediatek/audioprofile/AudioProfileImpl.java中的protected void persistValues(boolean overrideSystem)函数里面添加 this.persistRingtoneUri(TYPE_POWER_ON); this.persistRingtoneUri(TYPE_POWER_OFF);
public Uri getRingtoneUri(Context context, int type)函数里面添加 } else if (type == AudioProfile.TYPE_POWER_ON) { return mState.mPowerOnStream;
} else if (type == AudioProfile.TYPE_POWER_OFF) { return mState.mPowerOffStream;
private void persistRingtoneUri(int type) 函数里面添加 } else if(type == AudioProfile.TYPE_POWER_ON) {
persistValue(AudioProfileManagerImpl.MSG_PERSIST_POWERON_RINGTONE, mState.mPowerOnStream);
} else if(type == AudioProfile.TYPE_POWER_OFF) {
persistValue(AudioProfileManagerImpl.MSG_PERSIST_POWEROFF_RINGTONE, mState.mPowerOffStream); }
public void setRingtoneUri(Context context, int type, Uri ringtoneUri)函数里面添加 else if(type == AudioProfile.TYPE_POWER_ON) {
if((mState.mPowerOnStream == null && ringtoneUri != null) || (mState.mPowerOnStream != null && !mState.mPowerOnStream.equals(ringtoneUri))) { mState.mPowerOnStream = ringtoneUri;
mState.persistStreamUri(mKey, mResolver, type); if(isActive()) {
this.persistRingtoneUri(/*context,*/ type); } }
} else if(type == AudioProfile.TYPE_POWER_OFF) {
if((mState.mPowerOffStream == null && ringtoneUri != null) || (mState.mPowerOffStream != null
ArcherMind Inc. Proprietary – For Internal Use Only
CONFIDENTIAL Date
Page 22 of 33
&& !mState.mPowerOffStream.equals(ringtoneUri))) { mState.mPowerOffStream = ringtoneUri;
mState.persistStreamUri(mKey, mResolver, type); if(isActive()) {
this.persistRingtoneUri(/*context,*/ type); } } } (6)
mediatek/source/frameworks/media/audio/java/com/mediatek/audioprofile/AudioProfileManagerImpl.java中
protected static final int MSG_PERSIST_POWERON_RINGTONE = 9; protected static final int MSG_PERSIST_POWEROFF_RINGTONE = 10; @Override
public void handleMessage(Message msg)函数里面添加 case MSG_PERSIST_POWERON_RINGTONE:
persistPowerRingtone(msg, \); break;
case MSG_PERSIST_POWEROFF_RINGTONE:
persistPowerRingtone(msg, \); break; 此外,添加函数 private void persistPowerRingtone(Message msg, String key) { if (msg.obj == null) { SystemProperties.set(key, \); return; }
Uri ringtoneUri = (Uri)msg.obj;
Cursor c = mContext.getContentResolver().query(ringtoneUri, new String[] { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.TITLE_KEY }, null, null, null); if(c != null){ if(c.getCount() > 0){ c.moveToFirst(); String path = c.getString(c.getColumnIndex(\)); SystemProperties.set(key, path); } c.close(); }; } (7)
mediatek/source/frameworks/media/audio/java/com/mediatek/audioprofile/ProfileSettings.java
中
public static String getStreamUriKey(String profileKey, int type) 函数里面添加 } else if (type == AudioProfile.TYPE_POWER_ON) { return profileKey + SUFFIX_POWER_ON_URI; } else if (type == AudioProfile.TYPE_POWER_OFF) { return profileKey + SUFFIX_POWER_OFF_URI; }
public ProfileState(String key, HashMap
ArcherMind Inc. Proprietary – For Internal Use Only
CONFIDENTIAL Date
Page 23 of 33
this.mPowerOnStream = this.getPersistedUri(key,
initValues, cr, AudioProfile.TYPE_POWER_ON, null); this.mPowerOffStream = this.getPersistedUri(key,
initValues, cr, AudioProfile.TYPE_POWER_OFF, null);
public void persistStreamUri(String key, ContentResolver resolver, int type)函数里面添加 } else if(type == AudioProfile.TYPE_POWER_ON) { String value = this.mPowerOnStream == null ? null : this.mPowerOnStream.toString(); Settings.System.putString(resolver, name, value); } else if(type == AudioProfile.TYPE_POWER_OFF) { String value = this.mPowerOffStream == null ? null : this.mPowerOffStream.toString(); Settings.System.putString(resolver, name, value); } (8)
mediatek/source/frameworks/media/audio/java/com/mediatek/audioprofile/ProfileState.java public ProfileState(String key, HashMap
initValues, cr, AudioProfile.TYPE_POWER_ON, null); this.mPowerOffStream = this.getPersistedUri(key,
initValues, cr, AudioProfile.TYPE_POWER_OFF, null);
public void persistStreamUri(String key, ContentResolver resolver, int type)函数里面添加 } else if(type == AudioProfile.TYPE_POWER_ON) { String value = this.mPowerOnStream == null ? null : this.mPowerOnStream.toString(); Settings.System.putString(resolver, name, value); } else if(type == AudioProfile.TYPE_POWER_OFF) { String value = this.mPowerOffStream == null ? null : this.mPowerOffStream.toString(); Settings.System.putString(resolver, name, value); }
2.6 音量控制
Android为不同的应用场合定义了不同的Audio Stream: Voice Call, Ring,
Music,Alarm, Notification, DTMF。 这些AudioStream是相互独立的〃所以也有各自的音量。AudioStream的定义在android.media.AudioManager中 位置:frameworks/base/media/java/android/media/AudioManager.java
/** @hide Default volume index values for audio streams */
public static final int[] DEFAULT_STREAM_VOLUME = new int[] { 4, // STREAM_VOICE_CALL 7, // STREAM_SYSTEM 4, // STREAM_RING 8, // STREAM_MUSIC 4, // STREAM_ALARM
4, // STREAM_NOTIFICATION
ArcherMind Inc. Proprietary – For Internal Use Only
CONFIDENTIAL Date
Page 24 of 33
7, // STREAM_BLUETOOTH_SCO 7, // STREAM_SYSTEM_ENFORCED 11, // STREAM_DTMF 11, // STREAM_TTS 4, // STREAM_FM 4 // STREAM_MATV };
以上结构定义了默认音量。
用户按下音量控制的HardKey〃希望能调出音量调整的界面。缺省情况下〃按下音
量控制的硬件控制键Vol+/-〃调节的是当前被激活的(Active)AudioStream的音量〃如果你的程序当前没有正在播放任何声音〃按下Vol+/-调节的是来电铃声的音量。 在某一个程序运行时〃希望按下Vol+/-调节的是当前所使用的AudioStream的音量〃Android在Activity中提供了setVolumeControlStream()方法用来指定你的应用程序使用的Audio Stream类型。所以〃如果你的程序用到Audio的播放〃你首先要知道你的程序所用的Audio Stream类型〃并在onCreate()中调用setVolumeControlStream()来设定Audio Stream的类型。
调用详细路径如下: 文件
RingerVolumePreference.java AudioManager.java AudioService.java AudioSystem.java
原型
onCheckedChanged(CompoundButton buttonView, boolean isChecked)
setStreamVolume(int streamType, int index, int flags)
setStreamVolume(int streamType, int index, int flags)
native setStreamVolumeIndex(int stream, int index);
android_media_AudioSystem.cp
android_media_AudioSystem_setStreamVolumeIndex
p
AudioSystem.cpp AudioPolicyService.cpp AudioPolicyManager.cpp AudioPolicyService.cpp
setStreamVolumeIndex(stream_type stream, int index)
setStreamVolumeIndex(AudioSystem::stream_type stream, int index)
setStreamVolumeIndex(AudioSystem::stream_type stream, int index)
setStreamVolume(AudioSystem::stream_type stream, float volume, audio_io_handle_t output, int delayMs = 0);
ArcherMind Inc. Proprietary – For Internal Use Only
CONFIDENTIAL Date
Page 25 of 33