Android Sensor源码分析总结

作者: Android_until | 来源:发表于2019-03-29 21:29 被阅读5次

    本文概要性地介绍如下内容
    1,类架构框图
    2,Sensor Server

    • 初始化过程

    3,Sensor Client

    • 初始化过程
    • 与Server端通信的建立过程

    4,应用开发总结

    1,类架构框图

    如上图所示,Sensor Framework相对于Audio等模块来说,比较简单,摘录几个关键类的设计意图如下:

    /**
     * <p>
     * SensorManager lets you access the device's {@link android.hardware.Sensor
     * sensors}. Get an instance of this class by calling
     * {@link android.content.Context#getSystemService(java.lang.String)
     * Context.getSystemService()} with the argument
     * {@link android.content.Context#SENSOR_SERVICE}.
     * </p>
     * <p>
     * Always make sure to disable sensors you don't need, especially when your
     * activity is paused. Failing to do so can drain the battery in just a few
     * hours. Note that the system will <i>not</i> disable sensors automatically when
     * the screen turns off.
     * </p>
     * <p class="note">
     * Note: Don't use this mechanism with a Trigger Sensor, have a look
     * at {@link TriggerEventListener}. {@link Sensor#TYPE_SIGNIFICANT_MOTION}
     * is an example of a trigger sensor.
     * </p>
     * <pre class="prettyprint">
     * public class SensorActivity extends Activity, implements SensorEventListener {
     *     private final SensorManager mSensorManager;
     *     private final Sensor mAccelerometer;
     *
     *     public SensorActivity() {
     *         mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
     *         mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
     *     }
     *
     *     protected void onResume() {
     *         super.onResume();
     *         mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
     *     }
     *
     *     protected void onPause() {
     *         super.onPause();
     *         mSensorManager.unregisterListener(this);
     *     }
     *
     *     public void onAccuracyChanged(Sensor sensor, int accuracy) {
     *     }
     *
     *     public void onSensorChanged(SensorEvent event) {
     *     }
     * }
     * </pre>
     *
     * @see SensorEventListener
     * @see SensorEvent
     * @see Sensor
     *
     */
    public abstract class SensorManager {
            ......
    }
    
    /**
     * Sensor manager implementation that communicates with the built-in
     * system sensors.
     *
     * @hide
     */
    public class SystemSensorManager extends SensorManager {
            ......
    }
    
    class ISensorServer : public IInterface
    {
    public:
        DECLARE_META_INTERFACE(SensorServer);
     
        virtual Vector<Sensor> getSensorList(const String16& opPackageName) = 0;
        virtual sp<ISensorEventConnection> createSensorEventConnection(const String8& packageName,
                 int mode, const String16& opPackageName) = 0;
        virtual int32_t isDataInjectionEnabled() = 0;
    };
    
    /**
     * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
     * and the fields of this data structure must begin with hw_module_t
     * followed by module specific information.
     */
    struct sensors_module_t {
        struct hw_module_t common;
     
        /**
         * Enumerate all available sensors. The list is returned in "list".
         * @return number of sensors in the list
         */
        int (*get_sensors_list)(struct sensors_module_t* module,
                struct sensor_t const** list);
    
        /**
         *  Place the module in a specific mode. The following modes are defined
         *
         *  0 - Normal operation. Default state of the module.
         *  1 - Loopback mode. Data is injected for the the supported
         *      sensors by the sensor service in this mode.
         * @return 0 on success
         *         -EINVAL if requested mode is not supported
         *         -EPERM if operation is not allowed
         */
        int (*set_operation_mode)(unsigned int mode);
    };
    

    2,Sensor Server的初始化过程

    3,Sensor Client

    3.1 初始化过程

    3.2 与Server端通信的建立过程

    4,应用开发总结

    其中SensorEventListener的定义摘录如下,更多应用层开发细节请参考google 官方文档。

    /**
    * Used for receiving notifications from the SensorManager when
    * sensor values have changed.
    */
    public interface SensorEventListener {
    
       /**
        * Called when sensor values have changed.
        * <p>See {@link android.hardware.SensorManager SensorManager}
        * for details on possible sensor types.
        * <p>See also {@link android.hardware.SensorEvent SensorEvent}.
        * 
        * <p><b>NOTE:</b> The application doesn't own the
        * {@link android.hardware.SensorEvent event}
        * object passed as a parameter and therefore cannot hold on to it.
        * The object may be part of an internal pool and may be reused by
        * the framework.
        *
        * @param event the {@link android.hardware.SensorEvent SensorEvent}. 
        */
       public void onSensorChanged(SensorEvent event);
    
       /**
        * Called when the accuracy of the registered sensor has changed.
        *
        * <p>See the SENSOR_STATUS_* constants in
        * {@link android.hardware.SensorManager SensorManager} for details.
        *
        * @param accuracy The new accuracy of this sensor, one of
        *         {@code SensorManager.SENSOR_STATUS_*}
        */
       public void onAccuracyChanged(Sensor sensor, int accuracy);
    }
    

    相关文章

      网友评论

        本文标题:Android Sensor源码分析总结

        本文链接:https://www.haomeiwen.com/subject/wiarbqtx.html