1、android 静音与马达振动流程1,设置静音和振动静音和振动都属于来电后的动作.所以在设置静音和振动时都只是设置一些标识,并往数据库写入相应标识.文件:packages/apps/settings/src/com/android/settings/SoundAndDisplaySettings.javaprivate CheckBoxPreference mSilent;private CheckBoxPreference mVibrate;private void setRingerMode(boolean silent, boolean vibrate) if (silent) mAud
2、ioManager.setRingerMode(vibrate ? AudioManager.RINGER_MODE_VIBRATE :AudioManager.RINGER_MODE_SILENT); else mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,vibrate ? AudioManager.VIBRATE_SETTING_ON: AudioManager.VIBRATE_SET
3、TING_OFF);public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) if (preference = mSilent | preference = mVibrate) setRingerMode(mSilent.isChecked(), mVibrate.isChecked();if (preference = mSilent) updateState(false);.静音和振动是复选框按钮,两个中有一个发生变化时调用 setRingerMode 对状态
4、进行设置;如下状态描术:RINGER_MODE_SILENT 静音,且无振动RINGER_MODE_VIBRATE 静音,但有振动RINGER_MODE_NORMAL 正常声音,振动开关由 setVibrateSetting 决定.铃响模式的设置是通过 mAudioManager(音频管理器) 来实现的.2 音频管理器服务mAudioManager 所在服务如下:文件: frameworks/base/media/java/android/media/AudioManager.javapublic static final int RINGER_MODE_SILENT = 0;public s
5、tatic final int RINGER_MODE_VIBRATE = 1;public static final int RINGER_MODE_NORMAL = 2;public void setRingerMode(int ringerMode) IAudioService service = getService();try service.setRingerMode(ringerMode); catch (RemoteException e) Log.e(TAG, “Dead object in setRingerMode“, e);将铃响模式值传给音频接口服务 IaudioSe
6、rvicepublic static final int VIBRATE_TYPE_RINGER = 0;public static final int VIBRATE_TYPE_NOTIFICATION = 1;public static final int VIBRATE_SETTING_OFF = 0;public static final int VIBRATE_SETTING_ON = 1;public static final int VIBRATE_SETTING_ONLY_SILENT = 2;public void setVibrateSetting(int vibrateT
7、yp , int vibrateSetting) IAudioService service = getService();try service.setVibrateSetting(vibrateType, vibrateSetting); catch (RemoteException e) Log.e(TAG, “Dead object in setVibrateSetting“, e);将振动类型和振动设置传给音频接口服务 IaudioService,IaudioService 的定义如下:frameworks/base/media/java/android/media/IAudioSe
8、rvice.aidlframeworks/base/media/java/android/media/AudioService.java文件: frameworks/base/media/java/android/media/AudioService.java文件: frameworks/base/core/java/android/provider/Settings.javapublic void setRingerMode(int ringerMode) synchronized (mSettingsLock) if (ringerMode != mRingerMode) setRinge
9、rModeInt(ringerMode, true);/ Send sticky broadcastbroadcastRingerMode();将对应模式下的音量写入数据库,并将该模式广播.public void setVibrateSetting(int vibrateType, int vibrateSetting) mVibrateSetting = getValueForVibrateSetting(mVibrateSetting, vibrateType, vibrateSetting);/ Broadcast changebroadcastVibrateSetting(vibrat
10、eType);/ Post message to set ringer mode (it in turn will post a message/ to persist)sendMsg(mAudioHandler, MSG_PERSIST_VIBRATE_SETTING, SHARED_MSG, SENDMSG_NOOP, 0, 0,null, 0);同样将振动模式写入数据库,并广播该模式.3 硬件服务文件:frameworks/base/services/java/com/android/server/HardwareService.java开始振动:public void vibrate(
11、long milliseconds, IBinder token) if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.VIBRATE)!= PackageManager.PERMISSION_GRANTED) throw new SecurityException(“Requires VIBRATE permission“);/ Were running in the system server so we cannot crash. Check for a/ timeout of 0 or negati
12、ve. This will ensure that a vibration has/ either a timeout of 0 or a non-null pattern.if (milliseconds dev, 在 sys/class/timed_output 子目录创建文件 enablestatic int create_timed_output_class(void)if (!timed_output_class) timed_output_class = class_create(THIS_MODULE, “timed_output“);if (IS_ERR(timed_outpu
13、t_class)return PTR_ERR(timed_output_class);atomic_set(return 0;int timed_output_dev_register(struct timed_output_dev *tdev)int ret;if (!tdev | !tdev-name | !tdev-enable | !tdev-get_time)return -EINVAL;ret = create_timed_output_class();if (ret index = atomic_inc_return(tdev-dev = device_create(timed_
14、output_class, NULL,MKDEV(0, tdev-index), NULL, tdev-name);if (IS_ERR(tdev-dev)return PTR_ERR(tdev-dev);ret = device_create_file(tdev-dev, if (ret dev, tdev);tdev-state = 0;return 0;err_create_file:device_destroy(timed_output_class, MKDEV(0, tdev-index);printk(KERN_ERR “timed_output: Failed to regist
15、er driver %sn“,tdev-name);return ret;EXPORT_SYMBOL_GPL(timed_output_dev_register);驱动注册马达的驱动,注册一个定时器用于控制震动时间(回调函数 vibrator_timer_func) ,注册两个队列,一共给马达打开用,一共为马达震动关闭用。static void pmic_vibrator_on(struct work_struct *work)set_pmic_vibrator(1);static void pmic_vibrator_off(struct work_struct *work)set_pmic
16、_vibrator(0);static void timed_vibrator_on(struct timed_output_dev *sdev)schedule_work(static void timed_vibrator_off(struct timed_output_dev *sdev)schedule_work(static void vibrator_enable(struct timed_output_dev *dev, int value)hrtimer_cancel(if (value = 0)timed_vibrator_off(dev);else value = (val
17、ue 15000 ? 15000 : value);timed_vibrator_on(dev);hrtimer_start(static int vibrator_get_time(struct timed_output_dev *dev)if (hrtimer_active(return r.tv.sec * 1000 + r.tv.nsec / 1000000; elsereturn 0;static enum hrtimer_restart vibrator_timer_func(struct hrtimer *timer)timed_vibrator_off(NULL);return
18、 HRTIMER_NORESTART;static struct timed_output_dev pmic_vibrator = .name = “vibrator“,.get_time = vibrator_get_time,.enable = vibrator_enable,;void _init pxa_init_pmic_vibrator(void)INIT_WORK(INIT_WORK(hrtimer_init(vibe_timer.function = vibrator_timer_func;timed_output_dev_register(当上层要设置马达震动时,往文件/sy
19、s/class/timed_output/vibrator/enable 写入振动的时间长度,通过static ssize_t enable_store(struct device *dev, struct device_attribute *attr,const char *buf, size_t size)struct timed_output_dev *tdev = dev_get_drvdata(dev);int value;sscanf(buf, “%d“, tdev-enable(tdev, value);return size;调用驱动的 enable 函数也就是 vibrato
20、r_enable( .enable = vibrator_enable,)vibrator_enable|vtimed_vibrator_on(dev);|vschedule_work(|vpmic_vibrator_on|vset_pmic_vibrator(1); /给马达供电震动|vhrtimer_start(最终是设置马达的硬件控制驱动管给马达供电,并且启动定时器,定时时间是上层给的参数。定时时间到了就调用定时器的回调函数 vibrator_timer_funcvibrator_timer_func|vtimed_vibrator_off(NULL);|vschedule_work(|vpmic_vibrator_off|vset_pmic_vibrator(0); /断开马达的供电,马达停止震动最终是设置马达的硬件控制驱动管断开马达供电,停止马达震动本文来自 CSDN 博客,转载请标明出处:http:/