本文概要性地介紹如下內容
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);
}複製程式碼