使用GPS定位手机的位置

       本节将介绍通过GPS获取移动设备的位置信息,首先会对LocationManager类进行简单的介绍,然后将通过一个案例来演示如何应用Google服务。

11    LocationManager类相关介绍

LocationManager 类的对象提供了用于访问设备位置的服务,这些服务可以让应用程序获得周期性设备位置数据的更新,还可以在设备位置符合某种特定条件时触发Intent 广播。LocationManager 类的对象不用实例化,而是通过Context 对象的getSystemService(Context.LOCATION_SERVICE方法来获得的。

       通过调用LocationManager类的getLastKnownLocation(String provider) 方法可以取得地理位置信息,该方法的返回值是一个封装好经纬度等信息的Location对象,开发人员可以对其进行解析获取有用的信息。如果不设置查询要求getLastKnownLocation(LocationManager.GPS_PROVIDER) 的参数就传入 LocationManager.GPS_PROVIDER ;

1,             设置查询条件

当需要对地理位置信息获取设置查询条件时,需要创建一个Criteria 并调用该对象的set方法进行条件设置。设置的查询条件包括:地理位置的解析精度,允许的电池电量消耗级别,是否要求海拔高度和速度 等等。

              设置好查询条件之后,调用 LocationManager类的getBestProvider(Criteria criteria, Boolean enabledOnly) 传入创建好的Criteria 对象,该方法返回一个String 对象。

              该String 对象可以作为 LocationManager类的getLastKnownLocation()方法的参数。

 

2,             添加位置变化监听器

调用LocationManager类的getLastKnownLocation()方法只是主动的去获取移动设备的地理位置信息,如果需要设备位置移动后的位置信息自动返回通知系统,可以为LocationManager 添加一个监听器 LocationListener。实现该监听器需要实现以下几个方法。(四个

 

onLocationChanged(Location location

        当设备位置发生变化时 调用该方法

onProviderDisabled(String provider

        当设备的Location Provider 被禁止时,程序会调用该方法。注册监听器时,该方法被立即调用

onProviderEnabled(String provider

       当设备的LocationProvider 被启用时 调用该方法

onStatusChanged(String provider, int status, Bundle extras

        当设备的Location Provider 的状态发生变化时,调用该方法。可取的状态可以为:TEMPROARILY_UNAVALABLE,  OUT_OF_SERVICE,  AVALABLE


       通过LocationManager 的 requestLocationUpdates( String Provider,long minTime,float minDistance,LocationListener listener) 方法可以添加一个LocationListener 监听器,其中参数minTime代表位置更新的最短时间,minDistance 代表位置变化的最短距离。

       调用LocationManager 的removeUpdate() 方法可以移除指定的LocationListener 监听器

 

12 获取位置信息案例

上面已经简单介绍了相关的类和方法,下面通过一个案例来演示获取位置信息的步骤:

第一步,在eclipse里新建一个android项目sample01,打开res/layout目录下面的main.xml文件,配置好。

代码如下

-----------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <EditText
        android:id="id+@/et"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:editable="false"
        android:cursorVisiable="false"
        />
</LinearLayout>

-----------------------------------------------------------------------------------------------------

 

 

第二步,打开res/com/xtp/目录下的主activity ,代码如下:

-----------------------------------------------------------------------------------------------------

package com.xtp;
 
import android.app.Activity;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.EditText;
 
public class Google_Sample01 extends Activity {
    /** Called when the activity is first created. */
   LocationManager lm;
   EditText et;
   LocationListener listener = new LocationListener() {
      @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
        Location location = lm.getLastKnownLocation(provider);
        updateView(location);
      }
      @Override
      public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub
        updateView(null);
      }
      @Override
      public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
        updateView(location);
      }
   };
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        et = (EditText) findViewById(R.id.et);
      String bestProvier = lm.getBestProvider(getCriteria() , true);
location
      lm.requestLocationUpdates(bestProvier, 5000, 8, listener);
    }
    private void updateView(Location newLocation) {
      // TODO Auto-generated method stub
      if (newLocation != null) {
        et.setText("您现在的位置是\n 维度:");
        et.append(String.valueOf(newLocation.getLatitude()));
        et.setText("\n 经度:");
        et.append(String.valueOf(newLocation.getLongitude()));
      }else {
        et.getEditableText().clear();
      }
     
   }
   private Criteria getCriteria() {
      // TODO Auto-generated method stub
      Criteria mCriteria = new Criteria();
      mCriteria.setAccuracy(Criteria.ACCURACY_COARSE);
      mCriteria.setSpeedRequired(false);
      mCriteria.setCostAllowed(false);
      mCriteria.setBearingRequired(false);
      mCriteria.setAltitudeRequired(false);
      mCriteria.setPowerRequirement(Criteria.POWER_LOW);
     
      return mCriteria;
   }
}

-----------------------------------------------------------------------------------------------------

虽然模拟器中没有GPS设备,但是可以通过DDMS工具提供的 EmulatorControl 来模拟GPS数据。