02-Android-原生定位

大纲:
Anroid原生定位有缺点,
原生定位的常用类与接口
原生定位例子

Android系统提供了地理位置服务相关的API方便开发者去获得当前地理位置,位于android.location包中,
接口:
在这里插入图片描述
类:
在这里插入图片描述
LocationManager
该类提供了访问地理位置的服务,可以获取上一次最新的地理位置信息,也可以注册监听事件来周期性的获得设备更新的地理位置信息。LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

在获取地理位置信息时我们必须了解一下两个知识点:
1、provider
2、LocationListener
Provider:位置信息的提供者,android系统一般提供三种方式来获取地理位置信息。
1、GPS_PROVIDER:通过gps来获取地理位置的经纬度信息,优点:获取地理位置信息精确度高,缺点:只能在户外使用,获取经纬度信息耗时,耗电。
2、NETWORK_PROVIDER:通过移动网络的基站或者WiFi来获得地理位置,优点:只要有网络,获取速度快,在室内室外都可以使用。缺点:精确度不高。
3、PASSIVE_PROVIDER:被动的接收更新的地理位置信息,而不用自己主动请求地理位置。

LocationManager类中提供了以下几种方法来获得地理位置提供者。
1、public List getAllProviders();
返回当前设备所有地理位置提供者。
2、public List getProviders(boolean enabledOnly);
当参数为true时,返回的时当前设备可使用的位置提供者;当参数为false时和上面那个方法一样,返回所有的位置提供者。

3、public String getBestProvider(Criteria criteria, boolean enabledOnly);
当前设备最符合指定条件的位置提供者,第一个参数criteria用于指定条件,第二个参数表示是否返回当前设备可用的位置提供者。
4、public List getProviders(Criteria criteria, boolean enabledOnly);
以上方法也是返回当前符合条件的所有可用的provider。

Criteria类用于指定筛选最符合条件的地理位置提供者,根据Cirteria指定的条件,设备会自动选择哪种location provider。
Criteria类中提供如下方法来指定条件:
1、public void setAccuracy(int accuracy):位置解析精确度,
参数
Criteria.ACCURACY_FINE:表示高精确度。Criteria.ACCURACY_COARSE:表示模糊精确度。
2、public void setAltitudeRequired(boolean altitudeRequired ):是否要求海拔信息。
3、public void setBearingRequired(boolean bearingRequired):是否要求方向信息。
4、public void setCostAllowed(boolean costAllowed):是否允许收费
5、public void setSpeedRequired(boolean speedRequired):是否要求速度信息。
6、public void setPowerRequirement(int level):设置电池消耗要求,参数 Criteria. NO_REQUIREMENT, Criteria. POWER_LOW, Criteria. POWER_MEDIUM, Criteria. POWER_HIGH。分别表示 :无、低、中、高。
7、public void setBearingAccuracy(int accuracy):设置方向的精准度。参数 Criteria.NO_REQUIREMENT, Criteria.ACCURACY_LOW, Criteria.ACCURACY_HIGH。分别表示:无,低,高。
8、public void setSpeedAccuracy(int accuracy):设置速度的精准度。参数同上。
9、public void setHorizontalAccuracy(int accuracy):设置水平方向的精准度。参数同上。
10、public void setVerticalAccuracy(int accuracy):设置垂直方向的精准度。参数同上。
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);//设置定位精准度
criteria.setAltitudeRequired(false);//是否要求海拔
criteria.setBearingRequired(true);//是否要求方向
criteria.setCostAllowed(true);//是否要求收费
criteria.setSpeedRequired(true);//是否要求速度
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);//设置电池耗电要求
criteria.setBearingAccuracy(Criteria.ACCURACY_HIGH);//设置方向精确度
criteria.setSpeedAccuracy(Criteria.ACCURACY_HIGH);//设置速度精确度
criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);//设置水平方向精确度
criteria.setVerticalAccuracy(Criteria.ACCURACY_HIGH);//设置垂直方向精确度
//返回满足条件的,当前设备可用的location provider,当第二个参数为false时,返回当前设备所有provider中最符合条件的那个provider(但是不一定可用)。
String mProvider = mLocationManager.getBestProvider(criteria,true);
LocationManager类中提供了如下方法来获得最新一次更新的地理位置信息。
public Location getLastKnownLocation(String provider);
在这里插入图片描述
getLastKnownLocation()方法只能一次性的获得当前最新的地理位置,但是它不能实时的监听地理位置的变化情况。Android给开发者提供了一个接口监听类LocationListener来实时监听当前设备的地理位置变化情况。
LocationListener用于监听当地理位置有改变时来接收通知的接口类。在使用该监听之前必须要用LocationManager类中的如下方法来注册该监听事件。
在这里插入图片描述
参数一:位置提供者;
参数二:位置更新最短时间(单位ms);
参数三:位置更新最短距离(单位m);
参数四:LocationListener监听器对象。
public interface LocationListener {
//当位置改变时调用.
void onLocationChanged(Location location);
//当location provider的状态改变时,该方法被调用。
//状态有三种:
//OUT_OF_SERVICE:无服务
//TEMPORARILY_UNAVAILABLE:provider不可用
//AVAILABLE:provider可用
void onStatusChanged(String provider, int status, Bundle extras);
//当provider可用时调用,比如gps可用时就会调用该方法。
void onProviderEnabled(String provider);
//当provider不可用时调用该方法。
//比如gps未打开,gps不可用就会调用该方法。
void onProviderDisabled(String provider);
}
Geocoder该类用于获取地理位置的前向编码和反向编码,前向编码是根据地址获取经纬度;反向编码是根据经纬度获取对应的详细地址。Geocoder 请求的是一个后台服务,但是该服务不包括在标准android framework中。因此如果当前设备不包含location services,则Geocoder返回的地址或者经纬度为空。

可以使用 public static boolean isPresent():判断当前设备是否内置了地理位置服务。返回true表示Geocoder地理编码可以使用,否则不可使用。由于国内使用不了Google Services服务,因此一般的手机厂商都会在自己的手机内内置百度地图服务,或者高德地图服务来替代Google Services服务。
public List<Address> getFromLocation(double latitude, double longitude, int maxResults):根据经纬度返回对应的地理位置信息。参数一:经度;参数二:维度;参数三:返回地址的数目(由于同一经纬度可能对于多个地址,该参数取1~5之间)。

public List<Address> getFromLocationName(String locationName, int maxResults) :根据具体地址来获取相应的地理位置信息。参数一:地址;参数二:返回地址的数目(取1~5之间)。

Geocoder geocoder = new Geocoder(this);
boolean falg = geocoder.isPresent();
StringBuilder stringBuilder = new StringBuilder();
//根据经纬度获取地理位置信息
List

addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
//根据地址获取地理位置信息
List
addresses = geocoder.getFromLocationName( “广州大学华软软件学院", 1);
在这里插入图片描述
在这里插入图片描述
LocationManager:本类提供访问定位服务的功能,也提供获取最佳定位提供者的功能。
LocationListener:提供定位信息发生改变时的回调功能。必须事先在定位管理器中注册监听器对象。
Criteria:该类使得应用能够通过在LocationProvider中设置属性来选择合适的定位提供者。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值