㈠ android镓嬫満閮芥湁鍝浜泂ensor
1.Sensor Type
閲嶅姏镒熷簲/锷犻熷害浼犳劅鍣 (G-Sensor)
鍏夋劅搴 (Light-Sensor)
娓╁害镒熷簲
鏂瑰悜镒熷簲
纾佸満銆
涓磋繎镐
2.濡备綍瀹炵幇Sensor缂栫▼
a.銮峰彇绯荤粺链嶅姟锛圫ENSOR_SERVICE)杩斿洖涓涓猄ensorManager 瀵硅薄
sensormanager = (SensorManager)getSystemSeriver(SENSOR_SERVICE);
b.阃氲繃SensorManager瀵硅薄銮峰彇鐩稿簲镄凷ensor绫诲瀷镄勫硅薄
sensorObject = sensormanager.getDefaultSensor(sensor Type);
c.澹版槑涓涓猄ensorEventListener 瀵硅薄鐢ㄤ簬渚﹀惉Sensor 浜嬩欢锛屽苟閲嶈浇onSensorChanged鏂规硶
SensorEventListener sensorListener = new SensorEventListener(){
};
d.娉ㄥ唽鐩稿簲镄凷ensorService
sensormanager.registerListener(sensorListener, sensorObject, Sensor TYPE);
e.阌姣佺浉搴旂殑SensorService
sensormanager.unregisterListener(sensorListener, sensorObject);
f: SensorListener 鎺ュ彛鏄浼犳劅鍣ㄥ簲鐢ㄧ▼搴忕殑涓蹇冦傚畠鍖呮嫭涓や釜蹇呴渶鏂规硶锛
銆銆 onSensorChanged(int sensor,float values[]) 鏂规硶鍦ㄤ紶镒熷櫒鍊兼洿鏀规椂璋幂敤銆
璇ユ柟娉曞彧瀵瑰弹姝ゅ簲鐢ㄧ▼搴忕洃瑙嗙殑浼犳劅鍣ㄨ皟鐢(镟村氩唴瀹硅佷笅鏂)銆傝ユ柟娉旷殑鍙傛暟鍖呮嫭锛氢竴涓鏁存暟锛屾寚绀烘洿鏀圭殑浼犳劅鍣;涓涓娴镣瑰兼暟缁勶纴琛ㄧず浼犳劅鍣ㄦ暟鎹链韬銆傛湁浜涗紶镒熷櫒鍙鎻愪緵涓涓鏁版嵁鍊硷纴鍙︿竴浜涘垯鎻愪緵涓変釜娴镣瑰笺傛柟钖戝拰锷犻熻〃浼犳劅鍣ㄩ兘鎻愪緵涓変釜鏁版嵁鍊笺
銆銆 褰扑紶镒熷櫒镄勫嗳纭镐ф洿鏀规椂锛屽皢璋幂敤 onAccuracyChanged(int sensor,int accuracy) 鏂规硶銆傚弬鏁板寘𨰾涓や釜鏁存暟锛氢竴涓琛ㄧず浼犳劅鍣锛屽彟涓涓琛ㄧず璇ヤ紶镒熷櫒鏂扮殑鍑嗙‘鍊笺
3.鍏充簬G-Sensor
Android 锷犻熷害浼犳劅鍣ㄧ殑绫诲瀷鏄 Sensor.TYPE_ACCELEROMETER
阃氲繃 android.hardware.SensorEvent 杩斿洖锷犻熷害浼犳劅鍣ㄥ笺
锷犻熷害浼犳劅鍣ㄨ繑锲炲肩殑鍗曚綅鏄锷犻熷害镄勫崟浣 m/s^2(绫虫疮浜屾℃柟绉)锛屾湁涓変釜鏂瑰悜镄勫煎垎鍒鏄
銆銆values[0]: x-axis 鏂瑰悜锷犻熷害
銆銆values[1]: y-axis 鏂瑰悜锷犻熷害
銆銆values[2]: z-axis 鏂瑰悜锷犻熷害
銆銆鍏朵腑x,y,z鏂瑰悜镄勫畾涔夋槸浠ユ按骞虫斁缃鍦ㄧ殑镓嬫満镄勫彸涓嬭剼涓哄弬镦х郴鍧愭爣铡熺偣
銆銆x 鏂瑰悜灏辨槸镓嬫満镄勬按骞虫柟钖戯纴鍙充负姝
銆銆y 鏂瑰悜灏辨槸镓嬫満镄勬按骞冲瀭鐩存柟钖戯纴鍓崭负姝
銆銆y 鏂瑰悜灏辨槸镓嬫満镄勭┖闂村瀭鐩存柟钖戯纴澶╃┖镄勬柟钖戜负姝o纴鍦扮悆镄勬柟钖戜负璐
闇瑕佹敞镒忕殑鏄锛岀敱浜庡湴鐞冨浐链夌殑閲嶅姏锷犻熷害g (鍊间负9.8 m/s^2)锛
銆銆锲犳ょ幇瀹炰腑瀹为檯锷犻熷害鍊煎簲璇ユ槸 z鏂瑰悜杩斿洖鍊 - 9.8 m/s^2.
銆銆姣斿备綘浠 2 m/s^2 镄勫姞阃熷害灏嗘坠链烘姏璧凤纴杩欐椂z鏂瑰悜镄勮繑锲炲煎簲璇ユ槸 11.8 m/s^2.
銆銆鍙崭箣鑻ヤ互镓嬫満浠2 m/s^2 镄勫姞阃熷害鍧犺惤锛屽垯z鏂瑰悜镄勮繑锲炲煎簲璇ユ槸 7.8 m/s^2.
銆銆x,y鏂瑰悜鍒欐病链変笂杩伴檺鍒躲
㈡ android程序设计基础中service的基本原理是什么
1. 说明
android的后台运行在很多service,它们在系统启动时被SystemServer开启,支持系统的正常工作,比如MountService监听是否有SD卡安装及移除,ClipboardService提供剪切板功能,PackageManagerService提供软件包的安装移除及查看等等,应用程序可以通过系统提供的Manager接口来访问这些Service提供的数据,以下将说明他们的工具流程
2. 举例说明基本流程
以android系统支持sensor(传感器)实例来说明框架层的service和manager是如何配合工作的
1) 什么是sensor
sensor是传感器, 比如控制横竖屏切换利用的就是重力传感器(gsensor), 还有accelerator sensor可取得x, y, z三个轴上的加速度(应用如平衡球, 小猴吃香蕉等)
2) 应用程序调用(以下为关键代码)
sensorManager=(SensorManager)getSystemService(context.SENSOR_SERVICE);
lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
sensorManager.registerListener(sensorListener, lightSensor, SensorManager.SENSOR_DELAY_NORMAL);
3) Manager层
a) 提供给应用程序调用的接口,同实与Service交互,实现功能
frameworks/base/core/java/android/hardware/SensorManager.java
4) Service层
a) 开机时就运行的管理Sensor的后台服务
frameworks/base/services/java/com/android/server/SensorService.java
b) snesor后台服务需要的JNI,通过它与系统级交互
frameworks/base/services/jni/com_android_server_SensorService.cpp
5) 系统层
a) 传感器的头文件,硬件提供商按此文件的定义实现其功能
hardware/libhardware/include/hardware/sensors.h
b) 传感器的系统层实现,与内核交互,此处通常是硬件提供商提供的
hareware/libsensors
6) 内核及硬件层
内核访问硬件,同时以设备文件等方式提供给上层控制接口和传感器数据
3. 系统层实现
1) frameworks/base/core/java/android/*Manager.java 对应用的接口
2) frameworks/base/core/jni/ 对应用的接口的JNI
3) frameworks/base/services/java/com/android/server/ 后台服务
4) frameworks/base/services/jni/ JNI与系统层接口
5) hardware/libhardware/include/ 系统层头文件
6) hardware/libxxx 系统库支持
7) 内核支持
4. 应用程序如何使用
1) 查看系统提供哪些服务
find frameworks/base/core/java/android/ -name *Manager.java
此处可以看到调用系统提供服务的入口
2) 一般register listener,事件发生时都收到回调
5. 新建一个service(以froyo为例)
1) 接口:接口供应用调用
frameworks/base/core/java/android/app/ContextImpl.java 加服务名与Manager对应
frameworks/base/core/java/android/content/Context.java 加服务名定义
2) Manager:提供服务对应的调用接口
frameworks/base/core/java/android/app/StartXXXXManager.java 实现调用接口
frameworks/base/core/java/android/app/IXXXXManager.aidl 定义调用接口
frameworks/base/Android.mk 加入aidl的编译
3) service:提供后台服务支持
frameworks/base/services/java/com/android/server/XXXXService.java 服务实现
frameworks/base/services/java/com/android/server/SystemServer.java 启动服务
㈢ android怎么实现重力感应
由于重力感应器在板上安装的方向不同,而移植时需要调整相关的代码.
解决屏幕显示颠倒相关问题,相关的有两部分代码:
1.内核重力感应器驱动部分,如 MMA7660
1vi drivers/input/gsensor/mma7660.c
在这个文件中寻找相似以下的代码
1axis.y = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
2axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
3axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
然后按照你自己板的需要,将 X,Y 进行交换,进行相反数运算,将 Z 进行相反运算.
其实可以做得更方便一些,把这几个操作写到 Kconfig 里面,通过宏来控制这些运算,就不用再改代码了.
01#ifdef CONFIG_SWAP_XY02{
03 typeof(x) __tmp;
04 __tmp = x;05 x = y;
06 y = __tmp;07}08#endif09
10#ifdef CONFIG_REVERSE_X11 x = -x;12#endif13
14#ifdef CONFIG_REVERSE_Y15 y = -y;16#endif
17/* X Y 感应方向有问题,这很容易看出来.*/
18#ifdef CONFIG_REVERSE_Z
19 z = -z; /* 按正常情况下拿着设备,屏幕斜向上,如果不灵敏,把屏幕朝下试试,如果灵敏了,一般是 Z 反了.*/20#endif
2.Android部分,如果出现菜单显示正常,但是玩重力感应游戏时有问题,这部分就要修改(2.1)
1vim frameworks/base/core/java/android/view/WindowOrientationListener.java
1public void onSensorChanged(SensorEvent event) {
2 float[] values = event.values;
㈣ android gsensor 休眠震动唤醒功能如何实现
一、唤醒源
设备休眠后,通过触发唤醒源使设备恢复正常工作模式。设备唤醒源有多种,对于Android设备常见的就有PowerKey、来电唤醒、Alarm唤醒等。
唤醒源的实现处于内核空间,本文重点讨论下PowerKey作为唤醒源的具体实现。
二、PowerKey唤醒源
PowerKey唤醒设备的原理,本质其实就是中断。
PowerKey连接到CPU的一个输入(Input)引脚(Pin)上,该Pin运行在中断模式上。一旦PowerKey按下,引发Pin中断;而该中断具有唤醒CPU的功能,于是设备得以唤醒。
三、PowerKey对应的Pin
Configuration
和PowerKey相连的Pin的具体配置位于板级dts文件中,比如如下配置:
arch/arm/boot/dts/xxxxx.dts
power-key {
/** 是CPU的哪个Pin */
gpios = <&gpio0 GPIO_A5 GPIO_ACTIVE_LOW>;
/** Key code */
linux,code = <116>;
/** 起个名字 */
label = "power";
/** 该Pin具有wakeup的功能 */
gpio-key,wakeup;
};
着重说下linux,code =
<116>,116怎么来的?
对于键盘,每一个按键都有唯一的编码,在Linux中,编码值位于:
input.h (kernelincludeuapilinux)
/*
* Keys and buttons
*/
#define KEY_RESERVED 0
#define KEY_ESC 1
#define KEY_BACKSPACE 14
#define KEY_TAB 15
#define KEY_POWER 116 /* SC System Power Down */
可知,PowerKey的编码也在该文件中,且编码值为116;一旦按下PowerKey,该值作为键值传到input_event结构体的code成员变量中:
input.h (kernelincludeuapilinux)
/*
* The event structure itself
*/
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
之后我们会写个Linux应用程序读取code值。