写这篇文章的动机很明确,是想借助Android手机中的GPS模块获取较高的定位精度,但定位效果相当不好,至于百度地图的定位直观效果是地图匹配和约束的结果。在编写GPS定位的程序中,我将定位精度设为了ACCURACY_HIGH,权限依然是android.permission.ACCESS_FINE_LOCATION及android.permission.ACCESS_MOCK_LOCATION,调试后闪退,Logcat窗口没有一丁点信息,当然可以进行GPS的开关操作。
认真查看了几次代码比较合理,只有ACCURACY_HIGH,是之前没有用过的,退而求其次,还是用ACCURACY_FINE吧,结果程序运行正常。
1、先看关于位置的权限
(1)“android.permission.ACCESS_COARSE_LOCATION”
ACCESS_COARSE_LOCATION访问CellID或WiFi,只要当前设备可以接收到基站的服务信号,便可获得位置信息。
(2)“android.permission.ACCESS_FINE_LOCATION” 允许一个程序访问精良位置(如GPS)
(3) “android.permission.ACCESS_MOCK_LOCATION” 允许程序创建模拟位置提供用于测试
(4)"android.permission.ACCESS_LOCATION__EXTRA_COMMANDS" 允许应用程序访问额外的位置提供命令
而第四个是有一些特定方法的,it indicate that LocationManager.sendExtraCommand()
need this permission exactly.
2、看一下定位精度设定值
在Criteria类中一共有5类常量,分别是ACCURACY_COARSE,ACCURACY_FINE,ACCURACY_HIGH,ACCURACY_LOW,ACCURACY_MEDIUM。
1、ACCURACY_COARSE
A constant indicating an approximate accuracy requirement, Added in Level 1 Constant Value: 2 (0x00000002)
2、ACCURACY_FINE
A constant indicating a finer location accuracy requirement Added in Level1
Constant Value: 1 (0x00000001)
3、ACCURACY_HIGH
a constant indicating a high accuracy requirement -
may be used for horizontal, altitude, speed or bearing accuracy. For horizontal and
vertical position this corresponds roughly to an accuracy of less than 100 meters. added in Level 9
4、ACCURACY_LOW
an accuracy of greater than 500 meters. Constant Value: 1 (0x00000001) added in Level 9
5、ACCURACY_MEDIUM
an accuracy of between 100 and 500 meters. Constant Value: 2 (0x00000002) <pre name="code" class="plain" style="color: rgb(34, 34, 34); font-size: 15px; line-height: 19px; text-align: justify;">added in Level 9
仔细看会发现3、4、5是Level9添加进去的,而选择用HIGH精度的时候却没有相应的权限。
3、在没有符合设定criteria时,会依据电量需求、定位精度……进行选择,所以Android手机中定位精度要求是次要的,选择fine就很不错了,而我在做GPS静态测量实验时,将手机测得数值与GPS接收机对比,发现X、Y、Z三个方向最大为10m,水平距离误差在30米左右。
/*If no provider meets the criteria, the criteria are loosened in the following sequence: 1、power requirement 2、accuracy 3、bearing 4、speed 5、altitude */