Android中的LocationManager提供了一系列方法来处理地理位置相关的问题
通过getLastKnownLocation(String provider)以及requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)方法可以获取到当前位置
此类提供两种定位方式:GPS定位和网络定位(基站+WIFI)
GPS定位的provider是LocationManager.GPS_PROVIDER, 网络定位则是LocationManager.NETWORK_PROVIDER
这里使用的是GPS定位
流程:
一.对LocationManager以及Criteria进行初始化
二.获取系统定位服务,并通过Criteria得到相应的provider
三.获取UI相应控件,并设置按键监听事件
四.做locationListener监听事件
五.得到定位信息location,通过location得到位置信息 经度,纬度
六.请求位置信息的更新(在监听事件最后,在init方法里面,在Activity的onResume方法里面都要做(原因下面/**/有说))
七.页面退出时,要做资源释放onDestroy()
代码:
public class MainActivity extends Activity implements View.OnClickListener {
private Button btnGetLocation; //这里因为在Oncreate调用了init(),直接获取了,所以这里按键没用
private TextView tvLocation; //使用默认的布局页面里面的TextView
private LocationManager locationManager; //location管理
private LocationListener locationListener; //location监听
private String provider; //提供者
private Location location = null; //这个是用来得到
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到相应控件,并设置按键触发事件
btnGetLocation = (Button) findViewById(R.id.btn_getLocation);
btnGetLocation.setOnClickListener(this);
tvLocation = (TextView) findViewById(R.id.tv_location);
init(); //初始化的方法
}
//初始化方法
private void init() {
Criteria criteria = new Criteria(); //Criteria用来设置定位配置
criteria.setAccuracy(Criteria.ACCURACY_FINE); //设置为最大精度
criteria.setAltitudeRequired(false); //不要求海拔信息
criteria.setBearingRequired(false); //不要求方位信息
criteria.setCostAllowed(true); //是否允许付费
criteria.setPowerRequirement(Criteria.POWER_LOW); //对电量的要求
String serviceName = Context.LOCATION_SERVICE; //定位服务
//获取系统的定位服务
locationManager = (LocationManager) getSystemService(serviceName);
provider = locationManager.getBestProvider(criteria,true); //得到相应的提供者
/** 为什么要做多次locationManager.requestLocationUpdates(provider,1000,5,locationListener);
* 这里一定要对LocationManager进行重新设置监听(在Activity的onResume方法里面)
* locationManager获取provider的过程不是一次就能成功的
* locationManager.getLastKnownLocation很可能返回null
* 如果只在initProvider()中注册一次监听则基本很难成功
*/
if (provider!=null){
/* while(location==null)
{
locationManager.requestLocationUpdates(provider, 1000, 5, locationListener);
}*/
//得到定位信息location locationManager.requestLocationUpdates() 会返回一个当前的location(其实返回的时候已经是之前的了,在调用此方法的时候才是最新的)
updateNewLocation(locationManager.requestLocationUpdates(provider, 1000, 5, locationListener));
listener();
//更新位置
locationManager.requestLocationUpdates(provider,1000,5,locationListener);
}
}
private void updateNewLocation(Location location) {
if(location!=null){
//处理得到的信息
double la = location.getLatitude();
double ln = location.getLongitude();
String show = "当前的位置信息是: 纬度:"+la+",经度:"+ln;
tvLocation.setText(show);
}
}
//做locationListener监听事件
private void listener(){
locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
//在当前位置发送改变后被调用
updateNewLocation(location);
}
/**
*
* @param s 与变化相关的location provider名称
* @param i 状态,如果服务已经停止,并且短时间内不会改变,状态码为:OUT_OF_SERVICE
* 如果服务暂时停止,并且在短时间内会恢复,状态码为:TEMPPROARILY_UNAVAILABLE
* 如果服务正常有效,状态码为:AVALILABLE
* @param bundle 一组可选的参数
*/
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
//provider的状态在可用,暂时不可用和无服务三个状态下直接切换时被调用
}
//在Provider被用户开启后调用(这里的开启说的是gps)
@Override
public void onProviderEnabled(String s) {
}
//在Provider被用户关闭后调用(这里的关闭说的是gps)
//如果一个已经被关闭了的Provider调用requestLocationUpdates方法,那么这个方法就会被调用
@Override
public void onProviderDisabled(String s) {
}
};
locationManager.requestLocationUpdates(provider,6000,1,locationListener);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_getLocation:
listener();
break;
default:
break;
}
}
@Override
protected void onDestroy() {
locationManager.removeUpdates(locationListener);
locationManager.setTestProviderEnabled(provider,false);
super.onDestroy();
}
//页面启动后一直做locationManager获取provider 位置更新
@Override
protected void onResume() {
super.onResume();
locationManager.requestLocationUpdates(provider,6000,1,locationListener);
}
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(locationListener);
}
}
AndroidManifest文件里添加权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> //这一个权限定义后会报错,系统默认处理是去到debug文件里面(默认处理就行了)
总结:GPS遇到的问题点,主要就是locationManager.requestLocationUpdates返回location为null,经过debug后知道,是需要经过多次刷新才会得到
(这里的GPS只是做基本,实际开发中的话,还是使用第三方提供的API地图,比如百度地图,德高地图,都有详细的开发文档!!!而且功能强大.)