使用GPS定位手机的位置
本节将介绍通过GPS获取移动设备的位置信息,首先会对LocationManager类进行简单的介绍,然后将通过一个案例来演示如何应用Google服务。
1.1 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 监听器
1.2 获取位置信息案例
上面已经简单介绍了相关的类和方法,下面通过一个案例来演示获取位置信息的步骤:
第一步,在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数据。