android-5.0 sensor工作原理—Sensor APP数据的获取

本文介绍了在Android 5.0中如何获取Sensor数据,首先通过getSystemService获取SensorManager,然后定义EventListener,重写onSensorChanged和onAccuracyChanged方法。当传感器数据变化时,onSensorChanged会被调用,利用handleLightSensorEvent处理光照传感器数据。dispatchSensorEvent负责将数据传递给应用程序并触发onSensorChanged处理事件。
摘要由CSDN通过智能技术生成
Sensor app开发一般会包含五步:

1. 获取sensor manager对象;
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

2. 获取sensor object;
mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

3. 定义eventListener:
mLightSensorListener = new SensorEventListener()
 
4. 注册eventListener;
mSensorManager.registerListener(mLightSensorListener, mLightSensor,
                        LIGHT_SENSOR_RATE_MILLIS * 1000, mHandler);
5. 卸载eventListener;
mSensorManager.unregisterListener(mLightSensorListener);

1. 获取sensor manager对象,getSystemService()实际上是调用registerService()来获得一个sensorManager.

        registerService(SENSOR_SERVICE, new ServiceFetcher() {
                public Object createService(ContextImpl ctx) {
                    return new SystemSensorManager(ctx.getOuterContext(),
                      ctx.mMainThread.getHandler().getLooper());
                }});

 public SystemSensorManager(Context context, Looper mainLooper){
	……
	nativeClassInit();
	……
	i = nativeGetNextSensor(sensor, i);
	……
}

    nativeGetNextSensor()通过SensorManager::getInstance()获取sensorManager对象,通过getSensorList(&sensorList);获取sensorlist。

nativeGetNextSensor(JNIEnv *env, jclass clazz, jobject sensor, jint next){
	SensorManager& mgr(SensorManager::getInstance());
    	Sensor const* const* sensorList;
   	 size_t count = mgr.getSensorList(&sensorList);
	……
}

getSensorList()通过sensorManager的构造方法assertStateLocked()来获取sensorService对象,assertStateLocked()同时会调用sensorService::getSensorList()来获取最终的sensorList,也就是前面sensorService启动时所获得了sensorList.


ssize_t SensorManager::getSensorList(Sensor const* const** list) const
{
    Mutex::Autolock _l(mLock);
    status_t err = assertStateLocked();
    if (err < 0) {
        return ssize_t(err);
    }
    *list = mSensorList;
    return mSensors.size();
}

status_t SensorManager::assertStateLocked() const {
    if (mSensorServer == NULL) {
        // try for one second
        const String16 name("sensorservice");
        for (int i=0 ; i<4 ; i++) {
            status_t err = getService(name, &mSensorServer);
            if (err == NAME_NOT_FOUND) {
                usleep(250000);
                continue;
            }
            if (err != NO_ERROR) {
               
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值