您的位置:首页 > 移动开发 > Android开发

Android学习笔记(十一)基于位置的服务

2016-11-30 13:50 295 查看

11.1 简介

基于位置的服务简称 LBS,主要的工作原理就是利用无线电通讯网络或 GPS 等定位方式来确定出移动设备所在的位置。有了Android系统作为载体,才得以广泛应用。

11.2 找到自己的位置

11.2.1 基本用法

在Android中基于位置的服务主要借助LocationManager类来实现。基本使用方法如下:
(1)获取实例
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);


(2)选择一个位置提供器来确定设备的当前位置。
Android中一般有三种位置提供器可供选择:

GPS_PROVIDER:使用GPS定位,精准度较高,但非常耗电,当要求精准度高时使用。
NETWORK_PROVIDER:使用网络定位,精准度稍差,但耗电量较少,一般情况下使用更划算。
PASSIVE_PROVIDER:位置和Google搜索,使用较少,前两种使用多。

注意:定位功能必须由用户开启(设置→定位服务)。
//使用网络定位位置提供器
String provider=LocationManager.NETWORK_PROVIDER;
//得到Location对象,其中包含经度、纬度、海拔等一系列位置信息
Location location=locationManager.getLastKnownLocation(provider);


(3)如果有时候想让定位精确度较高,但又不确定GPS定位是否开启,可以先判断下有哪些位置提供器可用。
//传入true表示只有启用的位置提供器才会返回
List<String> providers = locationManager.getProviders(true);

(4)另外,当设备位置发生改变时,也可以通过LocationManager的 requestLocationUpdates()方法获取到最新的位置信息,如下:
/**
* param1:位置提供器的类型
* param2:监听位置发生变化的时间间隔(单位:毫秒)
* param3:监听位置发生变化的距离间隔(单位:米)
* param4:LocationListener监听器
*/
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, new LocationListener() {
@Override
public void onLocationChanged(Location location) {
//每5s检查一下位置变化情况,若移动距离超过10米,则调用该方法,并把新的位置信息传入
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override
public void onProviderEnabled(String provider) {

}

@Override
public void onProviderDisabled(String provider) {

}
});

11.2.2 确定自己的经纬度

获取当前设备的经纬度,示例代码如下:
public class MainActivity extends AppCompatActivity {

private TextView positionTextView;

private LocationManager locationManager;

private String provider;

//创建一个LocationListener监听实例
LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
//显示当前设备的位置信息
showLocation(location);
Toast.makeText(MainActivity.this, "onLocationChanged...", Toast.LENGTH_SHORT).show();
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override
public void onProviderEnabled(String provider) {

}

@Override
public void onProviderDisabled(String provider) {

}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

positionTextView = (TextView) findViewById(R.id.position_text_view);
//获取LocationManager实例
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//获取当前可用的位置提供器
List<String> providerList = locationManager.getProviders(true);
if (providerList.contains(LocationManager.GPS_PROVIDER)) {
provider = LocationManager.GPS_PROVIDER;
} else if (providerList.contains(LocationManager.NETWORK_PROVIDER)) {
provider = LocationManager.NETWORK_PROVIDER;
} else {
//当没有位置提供器可用时,提示用户
Toast.makeText(MainActivity.this, "No Location Provider to use!", Toast.LENGTH_SHORT).show();
//结束方法
return;
}

@SuppressWarnings("MissingPermission") Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
//显示当前设备的位置信息
showLocation(location);
}
//实时更新
//noinspection MissingPermission
locationManager.requestLocationUpdates(provider, 1000, 1, locationListener);
}

@Override
protected void onDestroy() {
super.onDestroy();
if (locationManager != null) {
//移除监听器
//noinspection MissingPermission
locationManager.removeUpdates(locationListener);
}
}

private void showLocation(Location location) {
String currentPosition = "latitude is:" + location.getLatitude() + "\n"
+ "longitude is:" + location.getLongitude();
positionTextView.setText(currentPosition);
}
}

记得声明权限:
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"
/>

效果如下:



这一章节的内容就到这里,原著中提到的反向地理编码是通过谷歌提供的接口来实现的,由于“防火墙”等等原因,估计现在国内大多数都在使用百度地图或者高德地图提供的API,所以不再总结;至于百度地图API的应用,之前接触过,知识较多,无法一一总结,使用到的时候去查看百度API文档或者示例代码即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: