需求背景:
手机的wifi连上了物联网设备,只能通信,没有网络数据。在这个前提下需要获得手机的经纬度。
解决办法:
1.尝试使用百度地图并且网络请求绑定为移动网络。结果:由于百度把网络请求的逻辑封装起来了,
没有办法进行绑定操作,失败!!!
2.尝试通过跨进程通信,开启一个新的进程专门用来进行定位请求,由于绑定移动网络到该进程时没有生效,所以也失败了!!
3.使用Android的GPS定位,没有网络也可以获取经纬度。赞一个!只不过在室内GPS基本不可行,这个是个弱点。
开发的思路:
作者的一点小建议:1.在百度这个的时候,看了很多人的分享,有很多是为了写这个而写的,也就是写给自己看的,所以看起来不是很清晰明了,这种要避免掉,不要因为这些而看了没耐心。2.看代码要看他的中心,有可能100行代码只有10行是中心,这个要学习观察,最好梳理一下流程,就像本文的GPS定位一样,最好梳理一下步骤。下面是我梳理的步骤。
实践步骤:
1.首先声明LocationManager变量,如下:
private LocationManager lm;
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
2.使用GPS定位,是通过将上面的lm的Provider设置LocationManager.GPS_PROVIDER。当然要在GPS打开的时候才能设置,否则不行,那么我们先做一个判断:
lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
表示GPS是否可用。
3.可用的话,可以设置lm的定位周期,如下
//设置定位的周期(含义:使用GPS,变化为1秒,1米更新一次)
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,1,locationListener);
//顺便把LocationListener给写了,这个使用监听位置信息改变的类。
private LocationListenerlocationListener =new LocationListener() {
@Override
public void onLocationChanged(Location location) {
Toast.makeText(GpsActivity.this,"位置信息正在变化,经纬度:" + location.getLongitude() +"/" +
location.getLatitude(), Toast.LENGTH_LONG).show();
}
@Override
public void onStatusChanged(String provider,int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
Toast.makeText(GpsActivity.this,"定位不可用!", Toast.LENGTH_LONG).show();
}
};
4.可以获取最新的位置信息
//获取最新的定位信息
Location location=lm.getLastKnownLocation(locationProvider);
到这里就差不多了。