定位有GPS定位和基站定位:GPS定位是基于卫星进行定位,要求头顶要空旷,定位误差在2-10米,基站网络定位是根据距离手机的距离进行定位,误差较大,只要手机有信号即可定位;获取gps信息分为以下几步:
1)获取与位置相关的服务 服务都是通过上下文获取出来的
manager =(LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
2)选择一种目前状态下最好的定位方式 gps定位或者基站定位
/**
*
* @param manager 位置管理服务
* @return 最好的位置提供者 // gps //wifi //
*/
private String getProvider(LocationManager manager){
//一组查询条件
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE); //获取精准位置、
criteria.setAltitudeRequired(false);//对海拔不敏感
criteria.setPowerRequirement(Criteria.POWER_MEDIUM);//耗电量中等
criteria.setSpeedRequired(true);//速度变化敏感
criteria.setCostAllowed(true);//产生开销 通信费用
//返回最好的位置提供者 true 表示只返回当前已经打开的定位设备
return manager.getBestProvider(criteria, true);
}
3)位置的监听器
4)注册位置监听器
代码如下:
/**
* 保证这个类只存在一个实例 1 私有化构造方法 (我们不能在外部实例化这个类的对象,只能类的内部实例化一个Person类的对象)
* 2 提供一个静态的返回实例的方法
*
*
*/
public class GPSInfoProvider {
LocationManager manager;
//单例
private static GPSInfoProvider mGPSInfoProvider;
private static Context context;
//单例
private static MyLoactionListener listener;
//1.私有化构造方法
private GPSInfoProvider(){};
//2. 提供一个静态的方法 可以返回他的一个实例 保证代码必须执行完成 放在 synchronized 单态的GPSInfoProvider
public static synchronized GPSInfoProvider getInstance(Context context){
if(mGPSInfoProvider==null){
mGPSInfoProvider = new GPSInfoProvider();
GPSInfoProvider.context = context;
}
return mGPSInfoProvider;
}
// 获取gps 信息
public String getLocation(){
//获取与位置相关的服务 服务都是通过上下文获取出来的
manager =(LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
//获取所有的定位方式
//manager.getAllProviders(); // gps //wifi //
//选择一种目前状态下最好的定位方式
String provider = getProvider(manager);
// 注册位置的监听器
/**
*provider 定位方式 用什么设备定位 基站 网络 GPS AGPS
*时间 gps 多长时间重新获取一下位置 最小为1分钟
*位置 最短位移 位置改变多少 重新获取一下位置
*listener 位置发生改变时 对应的回调方法
*/
manager.requestLocationUpdates(provider,60000, 50, getListener());
SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
String location = sp.getString("location", "");
return location;
}
// 停止gps监听
public void stopGPSListener(){
//参数为LocationListener
manager.removeUpdates(getListener());
}
//返回Listener实例
private synchronized MyLoactionListener getListener(){
if(listener==null){
listener = new MyLoactionListener();
}
return listener;
}
private class MyLoactionListener implements LocationListener{
/**
* 当手机位置发生改变的时候 调用的方法
*/
public void onLocationChanged(Location location) {
String latitude ="latitude "+ location.getLatitude(); //weidu
String longtitude = "longtitude "+ location.getLongitude(); //jingdu
SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
Editor editor = sp.edit();
editor.putString("location", latitude+" - "+ longtitude);
editor.commit(); //最后一次获取到的位置信息 存放到sharedpreference里面
}
/**
* 某一个设备的状态发生改变的时候 调用 可用->不可用 不可用->可用 GPS是否可用
*/
public void onStatusChanged(String provider, int status, Bundle extras) {
}
/**
* 某个设备被打开 GPS被打开
*/
public void onProviderEnabled(String provider) {
}
/**某个设备被禁用 GPS被禁用
*
*/
public void onProviderDisabled(String provider) {
}
}
/**
*
* @param manager 位置管理服务
* @return 最好的位置提供者 // gps //wifi //
*/
private String getProvider(LocationManager manager){
//一组查询条件
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE); //获取精准位置、
criteria.setAltitudeRequired(false);//对海拔不敏感
criteria.setPowerRequirement(Criteria.POWER_MEDIUM);//耗电量中等
criteria.setSpeedRequired(true);//速度变化敏感
criteria.setCostAllowed(true);//产生开销 通信费用
//返回最好的位置提供者 true 表示只返回当前已经打开的定位设备
return manager.getBestProvider(criteria, true);
}
}