获取地理位置有三个方法:
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>