locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);//获取服务
locationManager.getProviders(true); true 代表从打开的设备中查找
最主要的就是用网络定位,GPS定不到
if (providers.contains(LocationManager.GPS_PROVIDER)) { //拿到Provider
//如果是GPS
locationProvider = LocationManager.GPS_PROVIDER;
} else if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
//如果是Network
locationProvider = LocationManager.NETWORK_PROVIDER;
} else {
Intent i = new Intent();
i.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
activity.startActivity(i);
}
locationManager.requestLocationUpdates(locationProvider, 10000l, 0f, locationListener);//请求回调
location = locationManager.getLastKnownLocation(locationProvider);//请求最后一次
locationManager.removeUpdates(locationListener); //移除更新监听
location.getAccuracy();//精确度
<uses-feature android:name="android.hardware.location.gps" />//清单文件里配置
1. 权限一定要注意权限
2. locationManager.getProviders(true); true 代表从打开的设备中查找
部分安卓设备,第一次获取location时,会在locationManager.requestLocationUpdates处堵塞,导致程序一直卡在这里,迟迟得不到onLocationChanged的回调。我测试了安卓5,6, 7的设备,其中两个android5.1.1的设备一直都获取不到location,这就导致该定位无法在此设备上使用
但是有一个奇怪的现象,就是我在android5.1.1的设备上测试的时候,偶尔是可以得到一次location的,但这个几率极低。网上有说需要等待一段时间,在我这定不到就没戏了
执行后location永远为null,哪怕用网上流传的办法用while循环一直获取也无法得到非空的值。
其真正原因是三星等国内的手机厂商对android系统进行了改动,将谷歌的服务包删除,上述结果就是讲网络定位服务包缺少的结果,最明显的就是谷歌地图无法定位,因为谷歌地图用的也是这套api,而其他百度、高德等实用自己的地图api包,所以依然可以使用,而使用谷歌原版android就没有这个问题,在虚拟机中测试也可以发现运行正常。解决方法很简单,既然缺少服务包,那么重新加上即可,不用刷机,只是安装过程与一般的应用安装方法不同,一定记住先按框架再安装服务