android通过gps获取到当前位置

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


 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值