ANDROID Audio音效的设置和控制(6)

2020-04-18 02:32

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 initValues, ContentResolver cr)函数里面添加

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, ContentResolver cr)函数里面添加 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); }

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


ANDROID Audio音效的设置和控制(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:二外法语讲义—词汇语法篇-1

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: