我正在尝试在我的Android应用程序上使用线性加速度融合传感器。但是,它无法找到Sensor.TYPE_LINEAR_ACCELERATION的传感器。
我执行这些调用:
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mLinearAcceleration = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
在上述之后,定义了mAccelerometer,但mLinearAcceleration为空。我知道在API级别9之前没有添加TYPE_LINEAR_ACCELERATION,但我认为我至少在API级别9中运行。这是我的清单文件的片段:
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="17" />
所以我相信我在正确的API级别下工作。
但是,当我尝试列出所有可用的传感器时,我找不到所有适用于此API级别的传感器。
当我打电话给...
List<Sensor> l = mSensorManager.getSensorList(Sensor.TYPE_ALL);
for(Sensor s : l)
System.out.println(s.getName());
我得到了
Goldfish 3-axis Accelerometer
Goldfish 3-axis Magnetic field sensor
Goldfish Orientation sensor
Goldfish Temperature sensor
Goldfish Proximity sensor
这些都不是线性加速度,一个是Orientation,一个不赞成使用的传感器。看起来我的传感器运行时好像它们来自API级别9之前,但我不知道为什么会这样。我的项目中是否有某些字段可能会迫使应用程序充当较旧的API? (除了AndroidManifest.xml文件中已支持的最小API字段,已经设置为9)
答案 0 :(得分:1)
把它放在你的清单
中<uses-permission android:name=”android.permission.SET_ORIENTATION” />
是否可以访问加速度计
试试这个:
/* put this into your activity class */
private SensorManager mSensorManager;
private float mAccel; // acceleration apart from gravity
private float mAccelCurrent; // current acceleration including gravity
private float mAccelLast; // last acceleration including gravity
private final SensorEventListener mSensorListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent se) {
float x = se.values[0];
float y = se.values[1];
float z = se.values[2];
mAccelLast = mAccelCurrent;
mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z));
float delta = mAccelCurrent - mAccelLast;
mAccel = mAccel * 0.9f + delta; // perform low-cut filter
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
mSensorManager.unregisterListener(mSensorListener);
super.onPause();
}
而且:
/* do this in onCreate */
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
mAccel = 0.00f;
mAccelCurrent = SensorManager.GRAVITY_EARTH;
mAccelLast = SensorManager.GRAVITY_EARTH;