分享
分享赚钱 收藏 举报 版权申诉 / 15

类型android 静音与马达振动流程.doc

  • 上传人:gnk289057
  • 文档编号:6893134
  • 上传时间:2019-04-25
  • 格式:DOC
  • 页数:15
  • 大小:75KB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    android 静音与马达振动流程.doc
    资源描述:

    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:/

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:android 静音与马达振动流程.doc
    链接地址:https://www.docduoduo.com/p-6893134.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开