Pro Android学习笔记(一五六):传感器(6): 磁场传感器和方位(下)

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处http://blog.csdn.net/flowingflying/以及作者@恺风Wei。

坐标修订

在小例子中,新旧两种方法并没有显示太大的差异。单如果我们切换到横屏,情况会如何?用户在看地图,如果我们切换到横屏,我们仍希望我们所看的方位是根据用户视图,给出正前方的方位,也就是原来手机X轴的方位,也即相应的方位角、roll和pitch能够适应到横屏情况。新方法是基于矩阵进行计算,矩阵可以提供坐标轴更换的计算,Android提供了相关的API。我们在小例子的基础上进行对横屏情况的修正。

public class VirtualJax extends Activity implements SensorEventListener{
    private int mRotation;
    private float[] outR = new float[9];

    ……   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ......
        //【1】获得屏幕旋转的情况
        WindowManager window = (WindowManager) this.getSystemService(WINDOW_SERVICE);
        if(Build.VERSION.SDK_INT <8)
            mRotation = window.getDefaultDisplay().getOrientation();
        else
            mRotation = window.getDefaultDisplay().getRotation();       
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        ......    
        if(SensorManager.getRotationMatrix(inR, inclineMatrix, accelValues, compassValues)){
            //【2】坐标转换位API用于getRotationMatrix()和getOrientation()之间
            if(isAllowRemap && mRotation == Surface.ROTATION_90){
                //参数二表示设备X轴成为新坐标的Y轴,参数三表示设备Y轴成为新坐标-x轴(方向相反)
                SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, outR);
                SensorManager.getOrientation(outR, prefValues);
            }else{
                SensorManager.getOrientation(inR, prefValues);
            }
        ......         
    }
}

Pro Android学习笔记(一五六):传感器(6): 磁场传感器和方位(下)_第1张图片

地理北和地磁北

我们知道地理被极点和磁场的北极点很接近,但是不是重叠,两者之间的差异称为磁偏角。磁偏角和所在地点有关,即与经纬度相关,由于地磁位置不是一成不变的,所以和时间有关。如果磁场北极在地理北极的东边,磁偏角为正。下面是获得磁偏角的小例子,广州测得-2.662°。

public String getGeoNorthDeclination(){ 
    String providerName = locManager.getBestProvider(new Criteria(), true);
    Location loc = locManager.getLastKnownLocation(providerName);     
    //如果我们开启了gps,通常优选为gps,但是室内实际上很难马上获得gps,我们可以通过位置改变监听器的方式获取,为了方便,本例我们将改用network的基站三角定位的方式获得。
    if(loc == null && locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
        //在室内,由于不容易搜索到GPS,建议采用network方式。请注意,有些设备要在配置那里打开网络定位的选项,否则,network方式不能enabled,不能有效使用网络方式,getLastKnownLocation()仍会为null。正规的应用发现disabled,应该询问用户,并通过intent打开相关的配置页。
        loc = locManager.getLastKnownLocation( LocationManager.NETWORK_PROVIDER );
    } 
    
    if(loc == null)
        return null;
   
    GeomagneticField geo = new GeomagneticField((float)loc.getLatitude(),(float)loc.getLongitude(),
                                                                                   (float)loc.getAltitude(),System.currentTimeMillis());     
    float declination = geo.getDeclination();
 
    return String.format("磁偏角:%7.3f", declination);
}

相关小例子代码:Pro Android学习:传感器小例子

相关链接:我的Android开发相关文章

你可能感兴趣的:(Pro Android学习笔记(一五六):传感器(6): 磁场传感器和方位(下))