Android可以通过多种方式获取用户位置。本文主要将GPS和NETWORK两种方式。

先简单的介绍下怎么在Android设备上获取用户位置。

// 获取系统位置服务的引用
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
 
// 定义对位置变化的监听函数
LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
      // Called when a new location is found by the network location provider.
      makeUseOfNewLocation(location);
    }
 
    public void onStatusChanged(String provider, int status, Bundle extras) {}
 
    public void onProviderEnabled(String provider) {}
 
    public void onProviderDisabled(String provider) {}
  };
 
//向位置服务注册监听函数来接受位置更新
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);


首先要获取LocationManager对象,LocationManager不能直接new出来,他是系统的一项服务。


requestLocationUpdates()方法是来更新用户的位置的。第一个参数是Location Provider(位置提供者)的使用类型。(本例中使用的是基于手机信号塔和Wi_FI基站的网络位置提供者)。二个参数是通知之间的最小时间间隔(单位微秒),第三个是通知之间最小的距离变化(单位米)。将两个的值设置为零可以尽可能频繁的获取位置的通知。最后一个参数是 接受位置更新回调函数LocationListener。

为了使用GPS提供者来获取位置的更新,可以将NETWORK_PROVIDER.更改为GPS_PROVIDER。也可以通过两次调用requestLocationUpdates()(一次 NETWORK_PROVIDER ,一次GPS_PROVIDER.)来同时使用GPS和Network Location 内容提供者获取位置更新。

为了能够接受来自 NETWORK_PROVIDER或者GPS_PROVIDER的位置更新,必须在Android 的mainifest的文件中声明ACCESS_COARSE_LOCATION 或者ACCESS_FINE_LOCATION的用户权限。如果没有这些权限,会报错。NETWORK_PROVIDER需要ACCESS_COARSE_LOCATION权限(粗糙的定位权限),GPS_PROVIDER需要ACCESS_FINE_LOCATION权限(精确的定位权限)。当然,如果有ACCESS_FINE_LOCATION权限,NETWORK_PROVIDER和GPS_PROVIDER都能用

LocationListener中的四个回调函数

onLocationChanged:当位置变化时调用

onStatusChanged:此方法在Provider的状态在可用、暂时不可用和无服务三个状态直接切换时被调用。试了一下,在位置提供者为network的前提下,联网和断网此方法会被调用

onProviderEnabled和onProviderDisabled:provider被用户开启或关闭后调用。试了一下,在位置提供者为GPS的前提下,打开和关闭GPS此方法会被调用。

最后附上一个Demo:

package com.tianjf.locationgpsdemo;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	TextView mTextView;
	LocationManager mLocationManager;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mTextView = (TextView) findViewById(R.id.text_view);

		mLocationManager = (LocationManager) this
				.getSystemService(Context.LOCATION_SERVICE);
		openGPSSetting();
		getLocation();
	}

	private void openGPSSetting() {
		if (mLocationManager
				.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
			Toast.makeText(this, "GPS模块正常", Toast.LENGTH_SHORT).show();
			return;
		}

		Toast.makeText(this, "请开启GPS!", Toast.LENGTH_SHORT).show();
		// 跳转到GPS的设置页面
		Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
		startActivityForResult(intent, 0); // 此为设置完成后返回到获取界面
	}

	private void getLocation() {
		// android通过criteria选择合适的地理位置服务
		Criteria criteria = new Criteria();
		criteria.setAccuracy(Criteria.ACCURACY_FINE);// 高精度
		criteria.setAltitudeRequired(false);// 设置不需要获取海拔方向数据
		criteria.setBearingRequired(false);// 设置不需要获取方位数据
		criteria.setCostAllowed(true);// 设置允许产生资费
		criteria.setPowerRequirement(Criteria.POWER_LOW);// 低功耗

		String provider = mLocationManager.getBestProvider(criteria, true);// 获取GPS信息
		Location location = mLocationManager.getLastKnownLocation(provider);// 通过GPS获取位置
		updateUIToNewLocation(location);
		// 设置监听器,自动更新的最小时间为间隔N秒(这里的单位是微秒)或最小位移变化超过N米(这里的单位是米)
		mLocationManager.requestLocationUpdates(provider, 1 * 1000, 0.00001F,
				locationListener);
	}

	private void updateUIToNewLocation(Location location) {
		if (location != null) {
			mTextView.setText("纬度:" + location.getLatitude() + "\n经度"
					+ location.getLongitude());
            // Location类的方法:
            // getAccuracy():精度(ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION)
            // getAltitude():海拨
            // getBearing():方位,行动方向
            // getLatitude():纬度
            // getLongitude():经度
            // getProvider():位置提供者(GPS/NETWORK)
            // getSpeed():速度
            // getTime():时刻 
        } else {
			mTextView.setText("无法获取地理信息");
		}
	}

	// 定义对位置变化的监听函数
	LocationListener locationListener = new LocationListener() {
		public void onLocationChanged(Location location) {
			System.out.println("onLocationChanged");
			System.out.println("纬度:" + location.getLatitude() + "\n经度"
					+ location.getLongitude());
		}

		public void onStatusChanged(String provider, int status, Bundle extras) {
			System.out.println("onStatusChanged");
			System.out.println("privider:" + provider);
			System.out.println("status:" + status);
			System.out.println("extras:" + extras);
		}

		public void onProviderEnabled(String provider) {
			System.out.println("onProviderEnabled");
			System.out.println("privider:" + provider);
		}

		public void onProviderDisabled(String provider) {
			System.out.println("onProviderDisabled");
			System.out.println("privider:" + provider);
		}
	};
}