Android:GPS卫星定位

GPS (Global Position System,全球定位系统)是20世纪70年代由美国陆海空三军联合研制的新一代空间卫星导航定位系统。
Android 的位置服务中,有两个重要的类LocationManager和LocationProvider提供了一系列方法来处理位置相关的问题,包括查询一个已知位置;注册/注销来自某个 LocationProvider的周期性的位置更新;以及注册/注销接近某个坐标时对一个已定义Intent的触发等。今天我们就来看看Android 中LocatinManager的简单使用,以获取当前所在的位置为例。

首先,我们需要获取LocationManager的一个实例,这里需要注意的是他的实例只能通过下面这种方式来获取,直接实例化LocationManager是不被允许的。

Java代码
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
LocationManagerlocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);


得到了LocationManager的实例locatonManager以后,我们通过下面的语句来注册一个周期性的位置更新。
Java代码
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,  
1000 ,  0 , locationListener);   
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
1000, 0, locationListener);


这句代码告诉系统,我们需要从GPS获取位置信息,并且是每隔1000ms更新一次,并且不考虑位置的变化。最后一个参数是LocationListener的一个引用,我们必须要实现这个类。
Java代码
private   final LocationListener locationListener =  new  LocationListener() {  
    public   void onLocationChanged(Location location) {  //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发   
        // log it when the location changes   
        if (location !=  null ) {   
            Log.i("SuperMap",  "Location changed : Lat: "   
              + location.getLatitude() + " Lng: "   
              + location.getLongitude());  
        }  
    }   
   
    public   void onProviderDisabled(String provider) {   
    // Provider被disable时触发此函数,比如GPS被关闭   
    }   
   
    public   void onProviderEnabled(String provider) {   
    //  Provider被enable时触发此函数,比如GPS被打开   
    }   
   
    public   void onStatusChanged(String provider,  int status, Bundle extras) {   
    // Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数   
    }   
};   
private finalLocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Locationlocation) { //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
        // log it when the location changes
        if (location != null) {
           Log.i("SuperMap", "Location changed : Lat: "
              + location.getLatitude() + "Lng: "
              + location.getLongitude());
        }
    }
    public void onProviderDisabled(Stringprovider) {
    // Provider被disable时触发此函数,比如GPS被关闭
    }
    public void onProviderEnabled(Stringprovider) {
    // Provider被enable时触发此函数,比如GPS被打开
    }
    public void onStatusChanged(Stringprovider, int status, Bundle extras) {
    // Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
    }
};


以上的这些步骤一般应当在Activity的onCreate()阶段完成。

在成功注册了一个周期性坐标更新以后,我们就随时可以通过下面的方法来取得当前的坐标了。
Java代码
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);  
double latitude = location.getLatitude();     //经度   
double  longitude = location.getLongitude(); //纬度   
double altitude =  location.getAltitude();     //海拔   
Location location =locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
double latitude =location.getLatitude();     //经度
double longitude =location.getLongitude(); //纬度
double altitude =  location.getAltitude();     //海拔


不过这时候,如果你尝试去运行这个LocationSample的话程序启动时多半就会报错,因为我们没有设置GPS相关的权限,解决方法也相当简单,在AndroidManifest.xml中的block里添加下面这句即可解决权限的问题。
Java代码
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"  />   

如果是在模拟器中调试的话,我们有两种方法来设置一个模拟的坐标值,第一种是通过DDMS,我们可以在eclipse的ADT插件中使用这种方法,只要打开"Window" --&gt; "Show View" 中打开"Emulator Control" View即可看到如下的设置窗口,我们可以手动,或者通过KML和GPX文件来设置一个坐标。

另一种方法是使用geo命令,我们需要telnet到本机的5554端口(telnet localhost 5554 ),然后在命令行下输入类似于 geo fix -121.45356 46.51119 4392 这样的命令,后面三个参数分别代表了经度、纬度和(可选的)海拔。


完整案例如下:
java 代码:
import java.util.List;
import android.app.Activity;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.widget.TextView;
public class LocationTest extends Activity implementsLocationListener
{
    /** Calledwhen the activity is first created. */
    private LocationManager lm;
    private TextView tvOutput;
    private String best;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
         super.onCreate(savedInstanceState);
        setContentView(R.layout. main);
        lm = (LocationManager) this.getSystemService( LOCATION_SERVICE); // 从系统服务中获得位置管理器
        tvOutput = (TextView) findViewById(R.id. textView1);
        getMyLocation();
    }
    public void getMyLocation()
    {
        log("location providers");
        dumpProviders(); // 输出所有位置提供者(network, gps等)
        Criteria criteria = new Criteria(); // 定义规则
        criteria.setAccuracy(Criteria. ACCURACY_FINE); // 精确位置
        best = lm.getBestProvider(criteria, true); // 获得最合适的提供者
        log("\n best provider is :" + best);
        Location location = lm.getLastKnownLocation(best); // 获得最后可知的位置
        dumpLocation(location);
    }
    // 获得所有提供者信息
    public void dumpProviders()
    {
        List<String> list = lm.getAllProviders();
         for (String string : list)
        {
            dumpProvider(string);
        }
    }
    // 输出到TextView
    private void log(String string)
    {
        tvOutput.append(string + "\n");
    }
    // 获得每个位置提供者
    public void dumpProvider(String provider)
    {
        LocationProvider lp = lm.getProvider(provider);
        StringBuffer sb = new StringBuffer();
        sb.append("\n位置提供者名称:" + lp.getName());
        sb.append("\n提供者是否可用:" + lm.isProviderEnabled(provider));
        sb.append("\n 是否精确位置:" + lp.getAccuracy());
        sb.append("\n是否省电模式:" + lp.getPowerRequirement());
        sb.append("\n 是否需要网路:" + lp.requiresNetwork());
        sb.append("\n 是否需要无线网络:" + lp.requiresCell());
        sb.append("\n 是否需要GPS:" + lp.requiresSatellite());
        log(sb.toString());
    }
    public void dumpLocation(Location location)
    {
         if (location == null)
        {
            log("\n[Locationunknowen]");
             return;
        }
        log("\nLocation is:" +location.toString());
    }
    // 位置改变时获得坐标
    @Override
    public void onLocationChanged(Location arg0)
    {
        dumpLocation(arg0);
    }
    // 暂停时删除更新位置
    @Override
    protected void onPause()
    {
         super.onPause();
        lm.removeUpdates( this);
    }
    // 恢复时请求更新位置
    @Override
    protected void onResume()
    {
         super.onResume();
        //绑定临听
        lm.requestLocationUpdates(best, 1500, 1, this);
    }
    @Override
    public void onProviderDisabled(String arg0)
    {
        log("\nprovider disabled :" + arg0);
    }
    @Override
    public void onProviderEnabled(String arg0)
    {
        log("\nprovider enabled :" + arg0);
    }
    // 状态改变时
    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2)
    {
        log("\nstatus changed:provider:" + arg0 + ",status=" + arg1 + ",extra="+ arg2);
    }
}

AndroidManifest.xml
<?xml version= "1.0"encoding= "utf-8"?>
<manifest xmlns:android= "http://schemas.android.com/apk/res/android"
     package= "com.gps"
     android:versionCode= "1"
     android:versionName= "1.0">
<uses-permission android:name= "android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <application android:icon= "@drawable/icon"android:label= "@string/app_name">
        <activity android:name= ".LocationTest"
                  android:label= "@string/app_name">
            <intent-filter>
                <action android:name= "android.intent.action.MAIN" />
                <category android:name= "android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>



Android:GPS卫星定位_第1张图片


你可能感兴趣的:(Android:GPS卫星定位)