Android可以通过多种方式获取用户位置。本文主要将GPS和NETWORK两种方式。
先简单的介绍下怎么在Android设备上获取用户位置。
- //获取系统位置服务的引用
 - LocationManagerlocationManager=(LocationManager) this .getSystemService(Context.LOCATION_SERVICE);
 - //定义对位置变化的监听函数
 - LocationListenerlocationListener= new LocationListener(){
 - public void onLocationChanged(Locationlocation){
 - //Calledwhenanewlocationisfoundbythenetworklocationprovider.
 - makeUseOfNewLocation(location);
 - }
 - public void onStatusChanged(Stringprovider, int status,Bundleextras){}
 - public void onProviderEnabled(Stringprovider){}
 - public void onProviderDisabled(Stringprovider){}
 - };
 - //向位置服务注册监听函数来接受位置更新
 - 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{
 - TextViewmTextView;
 - LocationManagermLocationManager;
 - @Override
 - protected void onCreate(BundlesavedInstanceState){
 - 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的设置页面
 - Intentintent= new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
 - startActivityForResult(intent, 0 ); //此为设置完成后返回到获取界面
 - }
 - private void getLocation(){
 - //android通过criteria选择合适的地理位置服务
 - Criteriacriteria= new Criteria();
 - criteria.setAccuracy(Criteria.ACCURACY_FINE); //高精度
 - criteria.setAltitudeRequired( false ); //设置不需要获取海拔方向数据
 - criteria.setBearingRequired( false ); //设置不需要获取方位数据
 - criteria.setCostAllowed( true ); //设置允许产生资费
 - criteria.setPowerRequirement(Criteria.POWER_LOW); //低功耗
 - Stringprovider=mLocationManager.getBestProvider(criteria, true ); //获取GPS信息
 - Locationlocation=mLocationManager.getLastKnownLocation(provider); //通过GPS获取位置
 - updateUIToNewLocation(location);
 - //设置监听器,自动更新的最小时间为间隔N秒(这里的单位是微秒)或最小位移变化超过N米(这里的单位是米)
 - mLocationManager.requestLocationUpdates(provider, 1 * 1000 , 0 .00001F,
 - locationListener);
 - }
 - private void updateUIToNewLocation(Locationlocation){
 - 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( "无法获取地理信息" );
 - }
 - }
 - //定义对位置变化的监听函数
 - LocationListenerlocationListener= new LocationListener(){
 - public void onLocationChanged(Locationlocation){
 - System.out.println( "onLocationChanged" );
 - System.out.println( "纬度:" +location.getLatitude()+ "\n经度"
 - +location.getLongitude());
 - }
 - public void onStatusChanged(Stringprovider, int status,Bundleextras){
 - System.out.println( "onStatusChanged" );
 - System.out.println( "privider:" +provider);
 - System.out.println( "status:" +status);
 - System.out.println( "extras:" +extras);
 - }
 - public void onProviderEnabled(Stringprovider){
 - System.out.println( "onProviderEnabled" );
 - System.out.println( "privider:" +provider);
 - }
 - public void onProviderDisabled(Stringprovider){
 - System.out.println( "onProviderDisabled" );
 - System.out.println( "privider:" +provider);
 - }
 - };
 - }
 
转自:http://blog.csdn.net/tianjf0514/article/details/8295099

