这个安卓指南针其实是《Learning Android》一书中的一个例子,但是由于api的变更,代码在新版本中是不能通过编译的。我查找了一些新版本的资料,把原书中的例子更新了一下,发现结果也不太对。程序运行时,指针一直不停的抖动,根本没有实现方向定位的功能。究其原因还是对api的没有了解透彻。实现定位功能的代码如下:
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accelerometerValues = event.values;
Log.i("Compass","Got acceleration: " + event.values[0] +" "+ event.values[1] +" " + event.values[2]);
}
if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
magneticFieldValues = event.values;
Log.i("Compass","Got magnetic: " + event.values[0] +" "+ event.values[1] +" " + event.values[2]);
}
float[] values = new float[3];
float[] r = new float[9];
boolean success = SensorManager.getRotationMatrix(r, null, accelerometerValues,
magneticFieldValues);
if(success) {
SensorManager.getOrientation(r, values);
float orientation = (float) Math.toDegrees(values[0]);
//orientation = (orientation + 360)%360;
Log.i("Compass", "Got direction: " + orientation);
rose.setDirection(orientation);
}
}
其中SensorManager.getRotationMatrix()不一定能成功返回。当函数没有成功调用时,旋转矩阵中可能返回没有意义的值,进而在getOrientation()函数中,导致values为零值。这种错误就会导致前面说的那种抖动。
发表评论