近期任务,涉及Android触摸提示音。
首先,定位源码目标。很显然的,在原生的设置的声音功能页里面就包含了触摸音的开关。
那么我们找到对应的java代码,SoundSettings.java

package com.android.settings;import java.util.List;public class SoundSettings extends SettingsPreferenceFragment implements        Preference.OnPreferenceChangeListener {

可以看到 这是个PreferenceFragment的子类。(这里的SettingsPreferenceFragment是继承PreferenceFragment)。那么找到它对应的xml文件。

 @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        ContentResolver resolver = getContentResolver();        int activePhoneType = TelephonyManager.getDefault().getCurrentPhoneType();        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);        addPreferencesFromResource(R.xml.sound_settings);

常识性的,它在onCreate里面,找到addPreferencesFromResource,然后查看sound_settings的xml文件。
这里我通过查找中文string资源文件,标示了xml文件的一些item的title。

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"        android:title="@string/sound_settings"        android:key="sound_settings"        xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">        <com.android.settings.RingerVolumePreference            android:key="ring_volume"            android:title="@string/all_volume_title"            android:dialogTitle="@string/all_volume_title"            android:persistent="false"            android:streamType="ring" />        <Preference            android:key="musicfx"            android:title="@string/musicfx_title">        <intent android:targetPackage="com.android.musicfx"                android:targetClass="com.android.musicfx.ControlPanelPicker" />    Preference>        <PreferenceCategory            android:key="category_calls_and_notification"            android:title="@string/sound_category_call_ringtone_vibrate_title"/>        <com.android.settings.DefaultRingtonePreference            android:key="ringtone"            android:title="@string/ringtone_title"            android:dialogTitle="@string/ringtone_title"            android:persistent="false"            android:ringtoneType="ringtone" />        <CheckBoxPreference         android:key="vibrate_when_ringing"         android:title="@string/vibrate_when_ringing_title"         android:persistent="false" />        <PreferenceCategory            android:title="@string/sound_category_system_title"/>            <com.android.settings.DefaultRingtonePreference            android:key="notification_sound"            android:title="@string/notification_sound_title"            android:dialogTitle="@string/notification_sound_dialog_title"            android:persistent="false"            android:ringtoneType="notification" />        <CheckBoxPreference            android:key="dtmf_tone"            android:title="@string/dtmf_tone_enable_title"            android:defaultValue="true" />        <CheckBoxPreference            android:key="sound_effects"            android:title="@string/sound_effects_enable_title"            android:defaultValue="true" />        <CheckBoxPreference            android:key="lock_sounds"            android:title="@string/lock_sounds_enable_title"            android:defaultValue="true" />        <CheckBoxPreference            android:key="haptic_feedback"            android:title="@string/haptic_feedback_enable_title"            android:defaultValue="true" />        <ListPreference            android:key="emergency_tone"            android:title="@string/emergency_tone_title"            android:entries="@array/emergency_tone_entries"            android:entryValues="@array/emergency_tone_values" />

OK,接着我们在SoundSettings里面搜索关键字: sound_effects

private static final String KEY_SOUND_EFFECTS = "sound_effects";

接着搜索:KEY_SOUND_EFFECTS

        // 触摸提示音相关        mSoundEffects = (CheckBoxPreference) findPreference(KEY_SOUND_EFFECTS);        mSoundEffects.setPersistent(false);        mSoundEffects.setChecked(Settings.System.getInt(resolver,        Settings.System.SOUND_EFFECTS_ENABLED, 1) != 0);
    @Override    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {        if (preference == mVibrateWhenRinging) {            Settings.System.putInt(getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING,                    mVibrateWhenRinging.isChecked() ? 1 : 0);        } else if (preference == mDtmfTone) {            Settings.System.putInt(getContentResolver(), Settings.System.DTMF_TONE_WHEN_DIALING,            mDtmfTone.isChecked() ? 1 : 0);        } else if (preference == mSoundEffects) {            if (mSoundEffects.isChecked()) {                mAudioManager.loadSoundEffects();            } else {                mAudioManager.unloadSoundEffects();            }            Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED,            mSoundEffects.isChecked() ? 1 : 0);        }

这里我们很容易的看清楚它的实例和点击监听,都是通过修改系统配置来进行操作的,那么这玩意到底在哪里整呢?
首先,触摸提示音,是对所有的view的点击时间都会有触发效果,那么我们看看View.java的类。
View.java有将近2万行,想研究的彻底很明显是不现实,或者说,不轻松的。那么我们搜素SOUND_EFFECTS_ENABLED 这个关键字

    /**     * View flag indicating whether this view should have sound effects enabled     * for events such as clicking and touching.     */    public static final int SOUND_EFFECTS_ENABLED = 0x08000000;

看注释,意思是是否启动声音效果。

    /**     * Set whether this view should have sound effects enabled for events such as     * clicking and touching.     *     * 

You may wish to disable sound effects for a view if you already play sounds, * for instance, a dial key that plays dtmf tones. * * @param soundEffectsEnabled whether sound effects are enabled for this view. * @see #isSoundEffectsEnabled() * @see #playSoundEffect(int) * @attr ref android.R.styleable#View_soundEffectsEnabled */ public void setSoundEffectsEnabled(boolean soundEffectsEnabled) { setFlags(soundEffectsEnabled ? SOUND_EFFECTS_ENABLED: 0, SOUND_EFFECTS_ENABLED); } /** * @return whether this view should have sound effects enabled for events such as * clicking and touching. * * @see #setSoundEffectsEnabled(boolean) * @see #playSoundEffect(int) * @attr ref android.R.styleable#View_soundEffectsEnabled */ @ViewDebug.ExportedProperty public boolean isSoundEffectsEnabled() { return SOUND_EFFECTS_ENABLED == (mViewFlags & SOUND_EFFECTS_ENABLED); }

看到这2个方法我就有底了。很明显,我们要查看isSoundEffectsEnabled的调用关系。

    /**     * Play a sound effect for this view.     *     * 

The framework will play sound effects for some built in actions, such as * clicking, but you may wish to play these effects in your widget, * for instance, for internal navigation. * *

The sound effect will only be played if sound effects are enabled by the user, and * {@link #isSoundEffectsEnabled()} is true. * * @param soundConstant One of the constants defined in {@link SoundEffectConstants} */ public void playSoundEffect(int soundConstant) { if (mAttachInfo == null || mAttachInfo.mRootCallbacks == null || !isSoundEffectsEnabled()) { return; } mAttachInfo.mRootCallbacks.playSoundEffect(soundConstant); }

接着我们看谁调用了它,找到在AudioServeice.java中

    /** @see AudioManager#playSoundEffect(int) */    public void playSoundEffect(int effectType) {        playSoundEffectVolume(effectType, -1.0f);    }    /** @see AudioManager#playSoundEffect(int, float) */    public void playSoundEffectVolume(int effectType, float volume) {        sendMsg(mAudioHandler, MSG_PLAY_SOUND_EFFECT, SENDMSG_QUEUE,        effectType, (int) (volume * 1000), null, 0);    }

写到这里,就是完了。接下来的需要,也就是对触摸音的资源文件的修改,它的位置在framework/base/data/sounds/effects 文件夹下。(同时这个文件夹的ogg下面也有一个相同的文件,这个我还不清楚)Effect_Tick.ogg。
对应的是在Android system/media/audio/ui Effect_Tick.ogg的文件。
想要修改它的话,可以在编译room的时候替换了它,或者push 一个新的同名文件。

更多相关文章

  1. android 下写文件性能测试
  2. Android 命令行编译、打包生成apk文件
  3. Android Studio & ADT 快捷键配置文件所在目录,自定义后可导入导
  4. SlidingMenu和ActionBarSherlock结合做出出色的App布局,Facebook
  5. Android 实现View中添加子元素的动态效果
  6. Android实现下载文件功能的方法
  7. 【Android】文件读写操作(含SDCard的读写)
  8. android手机客户端上传文件,java servlet服务器端接收并保存到服
  9. android实践项目一实现简单的验证码和spinner下拉选项效果

随机推荐

  1. Android代码风格(Android属性前缀m的意思)
  2. Android(安卓)AIDL实现两个APP间的跨进程
  3. Android中bindService()启动Service的过
  4. 通信组件之Intent的基本使用
  5. Android(安卓)Studio提示端口号5037被占
  6. 通过GridView仿微信动态添加本地图片
  7. android RecyclerView实现列表定位
  8. Android文件存储和读取方式
  9. Android(安卓)简单实现订单模块类APP的物
  10. 那两年炼就的Android内功修养 - 老罗的An