震动:
private Vibrator vibrator;
  vibrator=(Vibrator)getSystemService(Service.VIBRATOR_SERVICE);
  vibrator.vibrate(2000);
  增加权限:
  <uses-permission android:name="android.permission.VIBRATE"/>
  -------------
  震动流程查看:
  1:Vibrator.java --这个里面实现了震动的一些常用接口,可以看到构造函数里面,通过
  IVibratorService.Stub.asInterface(
                ServiceManager.getService("vibrator"));
                获取到一个震动服务的接口,但是此函数是以@hide注释的,因此应用层无法直接使用此类。
  2:我们来查看我们的activity里面获取getSystemService(Service.VIBRATOR_SERVICE);
  我们来到ContextImpl.java 里面,看到getSystemService的具体实现:
  public Object getSystemService(String name) {
  ......
     } else if (VIBRATOR_SERVICE.equals(name)) {
            return getVibrator();
   我们再来看getVibrator函数为:
   
        private Vibrator getVibrator() {
        synchronized (mSync) {
            if (mVibrator == null) {
                mVibrator = new Vibrator();
            }
        }
        return mVibrator;
  此时将mVibrator返回给了应用。
    3:VibratorService.java里面是实现服务请求的具体操作:
    native static void vibratorOn(long milliseconds);
    native static void vibratorOff();
    这里可以看到是使用了本地函数来完成的振动开关。
    4:com_android_server_VibratorService.cpp 接口的本地实现:
    
     static void vibratorOn(JNIEnv *env, jobject clazz, jlong timeout_ms)
{
    // LOGI("vibratorOn\n");
    vibrator_on(timeout_ms);
}

static void vibratorOff(JNIEnv *env, jobject clazz)
{
    // LOGI("vibratorOff\n");
    vibrator_off();
}

static JNINativeMethod method_table[] = {
    { "vibratorOn", "(J)V", (void*)vibratorOn },
    { "vibratorOff", "()V", (void*)vibratorOff }
};

int register_android_server_VibratorService(JNIEnv *env)
{
    return jniRegisterNativeMethods(env, "com/android/server/VibratorService",
            method_table, NELEM(method_table));
}
    通过register_android_server_VibratorService在系统孵化机进入java世界时进行调用,将震动的本地接口向
    虚拟机进行注册。
    5:vibrator_on 和vibrator_off 函数在vibrator.c
    vibrator.c 里面是操作驱动的
    static int sendit(int timeout_ms)
{
    int nwr, ret, fd;
    char value[20];

fd = open(THE_DEVICE, O_RDWR);
    if(fd < 0)
        return errno;

nwr = sprintf(value, "%d\n", timeout_ms);
    ret = write(fd, value, nwr);

close(fd);

return (ret == nwr) ? 0 : -1;
}

int vibrator_on(int timeout_ms)
{
    /* constant on, up to maximum allowed time */
    return sendit(timeout_ms);
}

int vibrator_off()
{
    return sendit(0);
}
 这里便是打开驱动的open(THE_DEVICE, O_RDWR);,然后操作打开和关闭。
 驱动增加的为:
 6:这里便是差异部分了,各个平台实现名字都不一样了。本处为:
 sandbox.c里面
 static int __init vibrator_init(void)
{
return creat_vibrator_sysfs_file();
}

static void __exit vibrator_exit(void)
{
remove_vibrator_sysfs_file();
}
module_init(vibrator_init);
module_exit(vibrator_exit);
此处在creat_vibrator_sysfs_file则会去进行注册设备,将设备的处理函数和设备进行绑定,此时
open(THE_DEVICE, O_RDWR);
    nwr = sprintf(value, "%d\n", timeout_ms);
    ret = write(fd, value, nwr);
    这样子处理是,write函数会对应到此设备进行注册的写入函数,这时向文件设备写入不同的值,设备处理函数则会直接引起硬件操作,使得硬件真正跑起来。
-----

android震动代码分析相关推荐

  1. Android Audio代码分析8 - AudioHardwareALSA::openOutputStream函数

    发现以前写的东西,对调用函数的展开放在了函数的前面,导致不方便找到原来代码及设置的函数参数. 以后打算稍作改动,把对被调函数的展开放在原代码的后面,这样看起来应该方便些. 闲言少叙,跳入代码. 前两天 ...

  2. 基于Android T代码分析: 在freeform窗口的标题栏拖动时移动窗口流程和拖动freeform窗口边沿改变大小流程

    基于Android T代码分析: 在freeform窗口的标题栏拖动时移动窗口流程和拖动freeform窗口边沿改变大小流程在线看Android源代码网址: http://aospxref.com/a ...

  3. Android Audio代码分析(2): AudioPoilicyService 启动

    policy: 设备的选择 https://www.cxyzjd.com/article/VNanyesheshou/115659838 Android 音频源码分析--AudioTrack设备选择_ ...

  4. Android Region代码分析

    一.Region的定义和合法性检查 在Android系统中,定义了Region的概念,它代表屏幕上的一个区域,它是由一个或多个Rect组成的,代码位于frameworks/native/libs/ui ...

  5. Android UsbDeviceManager 代码分析

    USBDeviceManager是一个Android系统中用于管理USB设备的类,它是系统服务之一.其主要功能是控制USB设备的连接和断开,以及管理USB设备的权限和状态.下面是对USBDeviceM ...

  6. android vts代码分析,android vts测试笔记

    记录了android vts测试中遇到的一些常见问题,记录如下: 一 vts可以单独跑一个case ,比如 run vts -m XX -t XXX 二 如果不想跑vts单独验证一个case的话,可以 ...

  7. Android Audio代码分析25 - JNI callback

    今天来说说 native 中的代码是如何调用 java 侧代码的. 在看 setEnabled 代码的时候,我们了解到,最终在函数 EffectHandle::setEnabled 中会调用 java ...

  8. android audio代码分析,Android10.0AudioFocus之源码分析(二)

    前言 上一篇我们简单说了AudioFocus如何使用,那么今天就从源码角度看一下AudioFocus的实现原理. 正文 先说下requestAudioFocus,源码如下: public int re ...

  9. Android Audio代码分析7 - stream type

    在看AudioTrack代码的时候,我们看到,要创建一个AudioTrack对象,需要指定一个StreamType. 今天我们只把stream type相关的代码抽取出来,详细看看stream typ ...

最新文章

  1. 【Go】Go基础(十):文件读写
  2. redis mysql主从延迟_MySQL主从延迟问题解决
  3. Excel单样本T检验
  4. 合并k个有序链表 python_leetcode第23题-合并K个有序链表
  5. cad怎么将图层后置_CAD中如何将某1个图层置于其他图层之上.doc
  6. 文档智能理解:通用文档预训练模型与数据集
  7. 使用NPOI导入导出标准Excel(源码)
  8. SQL本地事务、asp.net事务、DTC
  9. 标准报表乱码出现??符号
  10. linux怎么做ppapi工具,如何在Linux上构建PPAPI插件?
  11. paraview远程模式
  12. 华为交换机常用的查询命令(自己学习时统计的)
  13. 百度网盘不限速下载器 proxyee down for Mac百度网盘高速下载器
  14. 矩阵转置相关公式_透析矩阵,由浅入深娓娓道来—高数-线性代数-矩阵
  15. 1vcpu等于几核?vcpu是什么意思
  16. 武汉大学计算机学院乒乓球室,武汉大学经济管理学院教职工乒乓球队在武汉大学师生乒乓球赛中获佳绩...
  17. linux下动态域名解析
  18. 理查德·克莱德曼钢琴曲全集(梦中的婚礼)
  19. Android 跨平台技术对比
  20. 用了半年的时间,把python学到了能出书的程度

热门文章

  1. 业界分享 | 京东推荐算法精排技术实践
  2. AOP(面向切面)原理及使用
  3. python 基础 之 re正则表达式的知识点整理,并简单使用说明
  4. 验证码论文概述-----中文篇
  5. VBA遍历文件夹下的所有文件
  6. 黑群晖(DSM7)使用docker挂载zerotier one实现内网穿透
  7. 郁闷的sendto失败
  8. python实现离散点图画法
  9. 提交代码到git仓库
  10. K_均值聚类算法(算法设计与C代码实现)