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); 
            } 
        ......          
    } 
}

地理北和地磁北

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值