安卓-指南针

这个安卓指南针其实是《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为零值。这种错误就会导致前面说的那种抖动。

发表评论