定位有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); } }