Android中有两种适用于相同类型的传感器

时间:2013-02-07 12:16:07

标签: android android-sensors

我正在使用三星Galaxy S3。当我检索到可用的传感器时:

我得到了如下结果:

 LSM330DLC 3-axis Accelerometer                    TYPE_ACCELEROMETER        
 AK8975C 3-axis Magnetic field sensor              TYPE_MAGNETIC_FIELD        
 iNemoEngine Orientation sensor                    TYPE_ORIENTATION          
 CM36651 Light sensor                              TYPE_LIGHT            
 CM36651 Proximity sensor                          TYPE_PROXIMITY            
 LSM330DLC Gyroscope sensor                        TYPE_GYROSCOPE             
 iNemoEngine Gravity sensor                        TYPE_GRAVITY               
 iNemoEngine Linear Acceleration sensor-S/W        TYPE_LINEAR_ACCELERATION   
 iNemoEngine Rotation_Vector sensor                TYPE_ROTATION_VECTOR     
 LPS331AP Pressure Sensor                          TYPE_PRESSURE            
 Rotation Vector Sensor                            TYPE_ROTATION_VECTOR        
 Gravity Sensor - software sensor                  TYPE_GRAVITY              
 Linear Acceleration Sensor                        TYPE_LINEAR_ACCELERATION   
 Orientation Sensor                                TYPE_ORIENTATION           
 Corrected Gyroscope Sensor                        TYPE_GYROSCOPE   
STMicroelectronics似乎是默认设备,谷歌公司和三星公司提供的传感器可能是次要传感器。 当我使用getVendor()方法时,它返回了STMicroelectronics(作为硬件默认传感器)和三星。但是当我注册了两个传感器时,onSensorChanged()被调用返回了方向值(俯仰,滚动和方位角),差别很大。

例如,我在相同的时间戳上获得了以下值(差异为几秒)。

                         pitch:       roll:                   azimuth:
Samsung                 0.5917465    -4.212                   84.583
STMicroelectronics      0.0865345    -3.88854                 356.825

为什么两者都存在差异,或者我们是否应该始终监控硬件和软件传感器?

3 个答案:

答案 0 :(得分:2)

加速度计,磁力,光线,接近度,陀螺仪,压力,重力,这些都是硬件传感器。

'iNemoEngine xxx'应该是谷歌在ICS中实施的一种“虚拟传感器”。

线性加速度计,旋转矢量,方向,这些是使用传感器融合算法实现的软件传感器。

http://electronicdesign.com/ios/understanding-virtual-sensors-sensor-fusion-context-aware-applications http://www.sensorplatforms.com/which-sensors-in-android-gets-direct-input-what-are-virtual-sensors/ http://www.thousand-thoughts.com/2012/03/android-sensor-fusion-tutorial/

答案 1 :(得分:2)

传感器对象将是设备上所有可用传感器的列表。

要检查特定传感器,请使用其他传感器常量之一,例如TYPE_TEMPERATURE,TYPE_RELATIVE_HUMIDITY或TYPE_PRESSURE。

还有getDefaultSensor()方法。将特定传感器常量传递给它还将确定设备上是否有传感器。

如果设备具有多个给定类型的传感器,则其中一个传感器将被设置为默认传感器。如果没有设置默认传感器,getDefaultSensor()将返回null,从而表明传感器不存在。

例如,使用getDefaultSensor()方法检查陀螺仪传感器的代码可能如下所示。

if (mSensorMgr.getDefaultSensor(Sensor.TYPE_GYROSCOPE) != null) 
{
   // Yesssss...gyroscope  sensor available
} 
else 
{
   // There's no gyroscope on this device :(
}

希望有所帮助......

答案 2 :(得分:0)

2个传感器由madhus提到的2个供应商提供。它可以使用代码获得:

List<Sensor> gyro =mSensorManager.getSensorList(Sensor.TYPE_GYROSCOPE); 
for(int i=0;i<gyro.size();i++) { 
Log.d(TAG,"The vendor is: " +gyro.get(i).getVendor() + " **" +gyro.get(i).getVersion());
}

除了定位(Samsung Inc和STMicroElectronics)之外,我还为STMicroElectronics和谷歌公司提供了所有传感器供应商。但是,由于默认和硬件传感器是STMicroElectronics,我正在使用它。