获取Android地理位置的方法

获取地理位置有三个方法:

GPS、网络、基站

1.使用GPS定位的方法如下

<pre name="code" class="java">LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
LocationListener gpsListener
gpsListener = new locationListener();
				locationManager.requestLocationUpdates(
						LocationManager.GPS_PROVIDER, 0, 0, gpsListener);

使用网络定位的方法同上,只需将 requestLocationUpdates() 函数的第一个参数改为NETWORK_PROVIDER 即可

 
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
<span style="font-family: Arial, Helvetica, sans-serif;">详细代码如下:</span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java">locationManager = (LocationManager) ((Context)ser_lis).getSystemService(Context.LOCATION_SERVICE);
		if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
		{
			try
			{
				System.out.println("in gps");				
				
				Location location = locationManager
						.getLastKnownLocation(LocationManager.GPS_PROVIDER);
				if (location != null)
				{
					latitude = location.getLatitude();
					longitude = location.getLongitude();
				}
				gpsListener = new locationListener();
				locationManager.requestLocationUpdates(
						LocationManager.NETWORK_PROVIDER, 0, 0, gpsListener);
				
			} catch (Exception e)
			{
				System.out.println(e.toString());
			}
		} else if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
		{			
			try
			{
				System.out.println("in network");							
				
				Location location = locationManager
						.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
				if (location != null)
				{					
					latitude = location.getLatitude(); // 经度
					longitude = location.getLongitude(); // 纬度
				}
				networkListener = new locationListener();
				locationManager.requestLocationUpdates(
						LocationManager.NETWORK_PROVIDER, 0, 0, networkListener);
				
			} catch (Exception e)
			{
				System.out.println("network wrong");
				System.out.println(e.toString());
			}

		}
		if(latitude != 0.0 || longitude != 0.0)
		{
			sendLocation(latitude, longitude);
		}
		System.out.println("\n经度2: " + latitude);
		System.out.println("\n纬度: " + longitude);
	}
	
	private class locationListener implements LocationListener
	{
		@Override
		public void onLocationChanged(Location location)
		{
			// TODO Auto-generated method stub
			System.out.println("in location change");
			latitude = location.getLatitude(); // 经度
			longitude = location.getLongitude(); // 纬度
			
			if(latitude != 0.0 || longitude != 0.0)
			{
				sendLocation(latitude, longitude);
			}
			System.out.println("\n经度1: " + latitude);
			System.out.println("\n纬度: " + longitude);
		}

		@Override
		public void onStatusChanged(String provider, int status, Bundle extras)
		{
			// TODO Auto-generated method stub
			
		}

		@Override
		public void onProviderEnabled(String provider)
		{
			// TODO Auto-generated method stub
			
		}

		@Override
		public void onProviderDisabled(String provider)
		{
			// TODO Auto-generated method stub
			
		}
		
	}

2.上面这种方法获取地理位置需要指定用哪种方式,下面介绍一种自动选择其中一种方式获取地理位置
 
<span style="font-family: Arial, Helvetica, sans-serif;">代码如下:</span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java">private LocationManager locationManager;  
    
    private static MyLocationListener listener;  
    private String provider;
    
	private double latitude = 0.0;
	private double longitude = 0.0;

public GpsLocation()
    {  
    
		locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		
		provider = getProvider(locationManager);
		Looper.prepare();
		System.out.println("gps");
		try
		{
			Location location = locationManager.getLastKnownLocation(provider);
			if (location != null)
			{
				latitude = location.getLatitude(); // 经度
				longitude = location.getLongitude(); // 纬度
				System.out.println("provider: " + provider);
				System.out.println("\n纬度1: " + latitude);
				System.out.println("\n经度: " + longitude);							
				
				sendLocation(latitude, longitude);				
			}
			
			listener = new MyLocationListener();
			locationManager.requestLocationUpdates(provider, 2000, 0, listener);
			
		} catch (Exception e)
		{
			System.out.println("get location wrong");
			System.out.println(e.toString());
		}
		
    }  
    
      
    // 停止GPS监听  
    public void stopGPSListener() {  
        locationManager.removeUpdates(listener);  
    }  
      
    private class MyLocationListener implements LocationListener {  
  
        @Override  
        /** 
         * 当位置发生变化时调用的方法 
         */  
        public void onLocationChanged(Location location) {  
            // TODO Auto-generated method stub  
        	System.out.println("in location change");
			latitude = location.getLatitude(); // 纬度
			longitude = location.getLongitude(); // 经度
			System.out.println("provider: " + provider);
			System.out.println("\n纬度1: " + latitude);
			System.out.println("\n经度: " + longitude);
			if(location != null)
			{
				sendLocation(latitude, longitude);
			}
        }  
  
        @Override  
        /** 
         * 设备被禁用时的回调方法 
         */  
        public void onProviderDisabled(String provider) {  
            // TODO Auto-generated method stub  
  
        }  
  
        @Override  
        /** 
         * 设备被打开时的回调方法 
         */  
        public void onProviderEnabled(String provider) {  
            // TODO Auto-generated method stub  
  
        }  
  
        @Override  
        /** 
         * 设备状态(可用、不可用)发生改变时回调的方法 
         */  
        public void onStatusChanged(String provider, int status, Bundle extras) {  
            // TODO Auto-generated method stub  
  
        }  
    }  
 
    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);  
        //这个方法是用来得到最好的定位方式,它有两个参数  
        //1、Criteria(类似于Map集合),一组关于定位的条件,速度、海拔、耗电量等  
        //2、enableOnly,布尔类型,false,有可能是已经关掉了的设备;true,就只会得到已经打开了的设备。  
        //如果手机中的GPS设备已经关闭,那么如果设置为false,则手机有可能仍然使用GPS设备提供定位,  
        //如果为true,则手机将不适应关闭的GPS设备定位,而是使用手机中开启的网络或其他设备提供定位  
        return manager.getBestProvider(criteria, true);  
    }  
	
}
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
3.如果是在非Activity类中使用上述方法,将Activity对象作为参数传递过来
 
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java">locationManager = (LocationManager) ((Context)ser_lis)
				.getSystemService(Context.LOCATION_SERVICE);

其中ser_lis为Activity对象
 
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
<span style="font-family: Arial, Helvetica, sans-serif;">4.在Manifest.xml文件中添加权限</span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java"><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 



 
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值