SensorManager介绍package com.nsors.acc;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.hardware.SensorManager;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
public class acc extends Activity {
float x, y, z;
SensorManager nsormanager = null;
Sensor accSensor = null;
Sensor lightSensor = null;
Sensor proximitySensor = null;
TextView accTextView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
tContentView(R.layout.main);
nsormanager = (SensorManager)getSystemService(SENSOR_SERVICE);
accSensor = DefaultSensor(Sensor.TYPE_ACCELEROMETER); lightSensor = DefaultSensor(Sensor.TYPE_LIGHT);
proximitySensor = DefaultSensor(Sensor.TYPE_PROXIMITY);
accTextView = (TextView)findViewById(view_name);
}
SensorEventListener lsn = new SensorEventListener() {
public void onSensorChanged(SensorEvent e) {
if (e.nsor == accSensor) {
Log.d("nsor", "found acc nsor");
x = e.values[SensorManager.DATA_X];
y = e.values[SensorManager.DATA_Y];
z = e.values[SensorManager.DATA_Z];
accTextView.tText("x = " + x + ", ny = " + y + ", nz = " + z);
}
el if (e.nsor == lightSensor) {
Log.d("nsor", "found light nsor");
accTextView.tText("data is " + e.values[0]);
}
el if (e.nsor == proximitySensor) {
Log.d("nsor", "found proximity nsor");
accTextView.tText("distance is " + e.values[0]);
}
}
public void onAccuracyChanged(Sensor s, int accuracy) {
}
};
@Override
protected void onResume() {
// nsormanager.unregisterListener(lsn);
}
@Override
protected void onStop() { // unregister listener
nsormanager.unregisterListener(lsn, accSensor);
nsormanager.unregisterListener(lsn, lightSensor);
nsormanager.unregisterListener(lsn, proximitySensor);
}
}
在onCreate()函数中,调⽤getSystemService(SENSOR_SERVICE)初始化⼀个SensorManager实例,为什么要⽤getSystemService函数,⽽不直接⽤new SensorManager呢?我们看此函数的实现,在ApplicationContext.java中,
if (SENSOR_SERVICE.equals(name)) {
return getSensorManager();
然后getSensorManager()的实现
private SensorManager getSensorManager() {
synchronized (mSync) {
if (mSensorManager == null) {
mSensorManager = new Handler().getLooper());
}
}
return mSensorManager;
}
看到没有?初始化SensorManager的时候需要Handler().getLooper()这个参数,这
个应该是⽤来传递消息⽤的,在SensorManager类的构造函数中会把此参数传给类成员mMainLooper。如果⽤new SensorManager()就需要另外获取mainLooper参数传递进去。
2、在android中跟nsor有关的⼀些⽂件有SensorManager.java,位于frameworks/ba/core/java/android/hardware⽬录
下,SensorService.java,位于frameworks/ba/rvices/java/com/android/rver⽬录下,android_hardware_SensorManager.cpp,位于frameworksbacorejni⽬录下,与SensorManager.java相对应,com_android_rver_SensorService.cpp,在frameworksbarvicesjni ⽬录下,与SensorService.java相对应。还有SystemServer.java⽂件,HardwareLibhardwareIncludeHardware⽬录下的Sensor.h头⽂件。另外我们需要根据Sensor.h实现⾃⼰的⼀个源⽂件,⼀般取名为nsors_xxx.c或者nsors_xxx.cpp。
3、SensorManager类分析
有⼏个函数⽐较重要,必须清晰理解它们的实现,才能了解整个传感器系统的实现。从⽽更好地去实现硬件抽象层的实现。⼏个⽐较重要的函数有构造函数SensorManager(), registerListener()和unregisterListener(),其中registerListener()和unregisterListener()有多个,标志为 @Deprecated的是过时的,就不要看了。
(1)构造函数SensorManager(Looper mainLooper)
这个函数⾸先获取得传感器系统服务,并赋给类成员mSensorService,
mSensorService = ISensorService.Stub.asInterface(
这⾥我要说⼀句,就是关于这个传感器系统服务,很多书上都说⽤getSystemService()是获得传感器的系统服务,⽽它返回的是SensorManager类型,所以以为整个系统都是使⽤同⼀个SensorManager类的实例,以为我们在任何地⽅使⽤的SensorManager实例都是同⼀个,它们的公共成员是共享的。但是经过这两天的分析,这种说法是错误的。其实每次调⽤getSystemService()函数时都初始化⼀个新的SensorManager实例,⽽这个SensorManager实例会在构造函数⾥通过取得传感器系统服务SensorService来实现对下层传感器的⼀些控制。⽽这个SensorService才是系统的传感器服务,说服务,不如说它只是SensorService类的⼀个实例罢了。它只在系统初始化时初始化⼀次。Android中的系统服务机制应该跟传感器的都差不多⼀个样,都是由不同的Manager调⽤下层相同的Service。你可以列举其它的Manager。那它是什么时候初始化呢?它是系统初始化在SystemServer进程⾥创建的,SystemServer是⼀个管理很多系统服务的进程,我们转到SystemServer.的main函数⾥,可以看到⼀直到调⽤int2()函数,它会创建⼀个ServerThread,最终调⽤AdbSettingsObrver类的run()函数,在r
un()函数⾥有这么有⼀句
// Sensor Service is needed by Window Manager, so this goes first
Log.i(TAG, "Sensor Service");
ServiceManager.addService(Context.SENSOR_SERVICE, new SensorService(context));
这⾥就创建SensorService实例了。在创建这个实例时会在SensorService构造函数中调⽤jni函数 public SensorService(Context context) {
if (localLOGV) Log.d(TAG, "SensorService startup");
_nsors_control_init();
}
我们看_nsors_control_init();对应的为
static jint
android_init(JNIEnv *env, jclass clazz)
{
nsors_module_t* module;
if (hw_get_module(SENSORS_HARDWARE_MODULE_ID, (const hw_module_t**)&module) == 0) {
if (nsors_control_open(&module->common, &sSensorDevice) == 0) {
const struct nsor_t* list;
int count = module->get_nsors_list(module, &list);
return count;
}
}
return 0;
}
它主要调⽤了nsor.h中的nsors_control_open()
static inline int nsors_control_open(const struct hw_module_t* module,
struct nsors_control_device_t** device) {
return module->methods->open(module,
SENSORS_HARDWARE_CONTROL, (struct hw_device_t**)device);
}
之后在系统任何地⽅使⽤的都是这个SensorService实例。最后run()函数调⽤Looper.loop();就进⾏消息循环等待了,这就是SystemServer进程的消息服务了。这才真正叫做系统服务嘛。
我们继续看SensorManager类的构造函数,取得SensorService后,
nativeClassInit();
这是⼀个jni函数,SensorManager类调⽤的jni函数都在com_android_rver_SensorService.cpp⾥,我们看这函数static void
nativeClassInit (JNIEnv *_env, jclass _this)
{
jclass nsorClass = _env->FindClass("android/hardware/Sensor");
SensorOffts& nsorOffts = gSensorOffts;
nsorOffts.name = _env->GetFieldID(nsorClass, "mName", "Ljava/lang/String;");
nsorOffts.vendor = _env->GetFieldID(nsorClass, "mVendor", "Ljava/lang/String;");
nsorOffts.version = _env->GetFieldID(nsorClass, "mVersion", "I");
nsorOffts.handle = _env->GetFieldID(nsorClass, "mHandle", "I");
nsorOffts.range = _env->GetFieldID(nsorClass, "mMaxRange", "F");
nsorOffts.power = _env->GetFieldID(nsorClass, "mPower", "F");
}
这个函数只是获取和设置⼀些信息吧,我们不关⼼。接着
nsors_module_init();
我们看这函数
static jint
nsors_module_init(JNIEnv *env, jclass clazz)
{
int err = 0;
nsors_module_t const* module;
err = hw_get_module(SENSORS_HARDWARE_MODULE_ID, (const hw_module_t **)&module);
if (err == 0)
sSensorModule = (nsors_module_t*)module;
return err;
}
它获取了nsor的模块信息,并把它赋给sSensorModule全局变量,之后传的modules参数都为这个。
接着在构造函数⾥
final ArrayList fullList = sFullSensorsList;
int i = 0;
do {
Sensor nsor = new Sensor();
i = nsors_module_get_next_nsor(nsor, i);
if (i>=0) {
Log.d(TAG, "found nsor: " + Name() +
", handle=" + Handle());
nsor.tLegacyType(Type()));
fullList.add(nsor);
sHandleToSensor.Handle(), nsor);
}
} while (i>0);
这⾥主要是通过jni函数nsors_module_get_next_nsor(nsor, i);获取传感器列表,并把它加⼊⾃⼰的fullList列表中。我们看nsors_module_get_next_nsor()函数
static jint
nsors_module_get_next_nsor(JNIEnv *env, jobject clazz, jobject nsor, jint next)
{
if (sSensorModule == NULL)
return 0;
SensorOffts& nsorOffts = gSensorOffts;
const struct nsor_t* list;
int count = sSensorModule->get_nsors_list(sSensorModule, &list);
if (next >= count)
return -1;
list += next;