Android SDK为GPS提供了很多API,其中LocationManager类是这些API的核心。LocationManger是一个系统服务类,所有与GPS相关的操作都由LocationManager对象及其派生的子对象完成。

locationManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE);

获取LocationProvider

LocationProvider类可以获取与为之提供者相关的信息
Location类是具体位置信息的抽象表示。
使用GPS定位的关键之一就是获取LocationProvider,每一个LocationProvider对象都表示一个抽象的定位系统。无论使用GPS做什么,都需要首先获取合适的LocationProvider对象。获取LocationProvider有三种方式:

  1. 获取所以可用的LocationProvider
    (1)获取LocationManager对象
locationManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE);

(2) 枚举法列举所有的LocationProvider的名称

List<String> providerNames=locationManager.getAllProviders();

此处返回值为String类型,是所有LocationProvider的名称。
全部的代码:

import android.content.Context;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.List;

public class MainActivity extends AppCompatActivity {
   private  ListView listView;
    private LocationManager locationManager;
    private TextView textView;
    private TextView textView1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView=(ListView) findViewById(R.id.priovider);
        textView1=(TextView) findViewById(R.id.tv1);

        //获取LocationManager对象
        locationManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
        //枚举法列举所有的LocationProvider的名称
        List<String> providerNames=locationManager.getAllProviders();
        ArrayAdapter<String> adapter=new ArrayAdapter<String>
                (this,android.R.layout.simple_list_item_1,providerNames);
       listView.setAdapter(adapter);
}
}
  1. 根据名称获取LocationProvider
//通过名称获取LocationProvider的名称
        LocationProvider provider=locationManager.getProvider(LocationManager.GPS_PROVIDER);
        textView1.append(provider.toString());
  1. 根据条件获取LocationProvider
listView=(ListView) findViewById(R.id.priovider);
        locationManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
        //创建一个过滤条件
        Criteria criteria=new Criteria();
        //要求LocationProvider是免费的
        criteria.setCostAllowed(false);
        //设置要求LocationProvider能提供高度信息
        criteria.setAltitudeRequired(true);
        //设置设置要求LocationProvider能提供方向信息
        criteria.setBearingRequired(true);
        //第二个参数true表示要以上条件全部满足
        List<String> providerNames=locationManager.getProviders(criteria,true);
        ArrayAdapter<String> adapter=new ArrayAdapter<String>
                (this,android.R.layout.simple_list_item_1,providerNames);
        listView.setAdapter(adapter);

GPS定位

(1)获取LocationManager对象

locationManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE);

(2)定义Location对象得到位置信息

//网络定位
 Location location =    locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
   //或者GPS定位
  Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
  //更新位置信息
  updateView(location);

这里需要注意的是通过getLastKnownLocation(String provider)传对应参数,此时得到的Location并非当前的GPS位置信息,而是上一次获取到的位置信息。
(3)用requestLocationUpdates真正去请求位置信息的更新

/*扫描时间间隔1s或者移动距离相差8米以上 则触发,如果收集到的话,
改变同时调用监听器onLocationChanged(Location location),
那么每次我们调用getLastKnownLocation事实上就是从这个系统存储中
获取这个信息,所以如果我们不调用此方法getLastKnownLocation
获取到的就可能是N天以前的位置信息了。*/

 locationManager.requestLocationUpdates(
            LocationManager.NETWORK_PROVIDER, 1000, 8, new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                //当GPS位置发生改变时,更新位置
                updateView(location);
         }

            @Override
            public void onStatusChanged(String s, int i, Bundle bundle) {
   }

            @Override
            public void onProviderEnabled(String s) { 
      updateView(locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER));
              //或者GPS_PROVIDER
            }

            @Override
            public void onProviderDisabled(String s) {
                updateView(null);
            }
        });

以下是更新视图函数

private void updateView(Location location) {
        if(location!=null){
            StringBuilder sb=new StringBuilder();
            sb.append("实时的位置信息:\n");
            sb.append("\n经度:");
            sb.append(location.getLongitude());
            sb.append("\n纬度:");
            sb.append(location.getLatitude());
            sb.append("\n高度:");
            sb.append(location.getAltitude());
            sb.append("\n速度:");
            sb.append(location.getSpeed());
            sb.append("\n方向:");
            sb.append(location.getBearing());
            editText.setText(sb.toString());

        }else{
            editText.setText("找不到location");
        }
    }

不过通过GPS定位很多时候都会得到空的location,所以现在有很多人都采用BEST_PROVIDER获取。