Android SDK为GPS提供了很多API,其中LocationManager类是这些API的核心。LocationManger是一个系统服务类,所有与GPS相关的操作都由LocationManager对象及其派生的子对象完成。
locationManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
获取LocationProvider
LocationProvider类可以获取与为之提供者相关的信息
Location类是具体位置信息的抽象表示。
使用GPS定位的关键之一就是获取LocationProvider,每一个LocationProvider对象都表示一个抽象的定位系统。无论使用GPS做什么,都需要首先获取合适的LocationProvider对象。获取LocationProvider有三种方式:
- 获取所以可用的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);
}
}
- 根据名称获取LocationProvider
//通过名称获取LocationProvider的名称
LocationProvider provider=locationManager.getProvider(LocationManager.GPS_PROVIDER);
textView1.append(provider.toString());
- 根据条件获取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获取。