Android 位置服务——用户定位User Location
来源:互联网 发布:linux display 详解 编辑:程序博客网 时间:2024/05/21 14:03
哎,这几天有点偷懒,博客几天没有更新啦,自己攒了一大堆知识没有整理,今天要抓紧调整状态,恢复之前的状态哦, 哦哦,不扯了,下面说今天总结的内容是基于位置服务的用户定位。
这项功能在手机应用中在常见不过了啦,QQ空间发状态有定位,微信有定位,滴滴打车更不用说,各种地图还有等等好多的应用都有定位的功能,那么这些为用户定位的功能是如何实现的呢,下面我们首先来看与用户定位有关的API。
User Location API
LocationManager:主要用于管理用户定位服务。
LocationProvider:主要用于管理设备获取用户位置所使用定位服务。现在目前的手机有三种定位功能:GPS, NETWORK,PASSIVE。
- GPS是我们很熟悉的卫星定位,通常我们的位置都是有三个卫星确定的。GPS的精度比较高,但是慢而且消耗电力,而且可能因为天气原因或者障碍物而无法获取卫星信息,另外有些设备可能没有GPS模块
- NETWORK是通过网络定位。就像现在的联通和移动在各地都设置了信号塔,为我们提供手机信号,它的定位就是通过确定我们使用的哪个信号塔,然后通过确定信号谈的位置来估算我们的位置。精度低,耗电少,获取信息速度较快,不依赖GPS模块。
- PASSIVE是一种被动的定位。现在很少使用这种定位方式,大多是使用前两种。
LocationListener:该类重要用于监听定位,当用户的位置发生改变或其他,我们想要对其进行操作时,我们可以使用该监听器。
获取用户Location
获取用户的位置信息,这里我们获取用户的经纬度。我们还是按照步骤讲解:
1. 添加权限。
注意:这里声明了两个权限:ACCESS_FINE_LOCATION,声明定位精度高的权限,一般是用于GPS,也可以是NETWORK;ACCESS_COARSE_LOCATION,声明定位精度低的权限,可以是NETWORK。
<!--声明定位的权限--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
2. 创建LocationManager的对象通过getSystemService(Context.LOCATION_SERVICE)
//这里要强制造型,因为getSystemService()方法返回的是一个Object的对象。LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
3. 绑定一个监听器,通过监听器中闯入的LocationListener来获取经纬度信息。
//绑定一个监听器 manager.requestLocationUpdates(provider, 0, 0, new LocationListener() { @Override public void onLocationChanged(Location location) { //该方法当用户位置改变时调用 } @Override public void onStatusChanged(String provider, int status, Bundle extras) { //当定位功能提供发生改变时调用 } @Override public void onProviderEnabled(String provider) { //当定位提供器可用时调用 } @Override public void onProviderDisabled(String provider) { //当定位提供器不可用时调用 } });
获取移动用户Location
有时候我们想定位位置不断改变的用户,这时我们该如何做呢?
还记的我们在上一节中注册监听器的方法么requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)
,这个方法传入四个参数:
provider:定位功能的提供类型。分为GPS_PROVIDER, NETWORK_PROVIDER, PASSIVE_PROVIDER。
minTime:两次定位之间的时间间隔,单位是ms。
minDistance:两次定位的最小距离,单位是m。
listener:我们定义的LocationListener 定位监听器对象。
如果我们想每隔10s,以及每隔10m给用户定位一次,我们可以书写如下:
public class MainActivity extends Activity implements LocationListener { private TextView mTextViewLongtitude; private TextView mTextViewLatitude; private LocationManager manager;//定义LocationManager的对象 private String provider;//定义位置提供者的类型 private List<String> providers;//获取定位提供者的对象 private double longitute;//用户的经度 private double latitude;//用户的纬度 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextViewLongtitude = (TextView) findViewById(R.id.textview_longtitude); mTextViewLatitude = (TextView) findViewById(R.id.textview_latitude); //步骤一:获取位置LocationManager对象 manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); //获得所有的位置提供器 providers=manager.getProviders(true); if(providers.contains(LocationManager.GPS_PROVIDER)){ provider=LocationManager.GPS_PROVIDER; }else if(providers.contains(LocationManager.NETWORK_PROVIDER)){ provider=LocationManager.NETWORK_PROVIDER; }else { Toast.makeText(getApplicationContext(), "没有相应的位置提供器!", Toast.LENGTH_SHORT).show(); } manager.requestLocationUpdates(provider, 10000, 10, this); } @Override public void onLocationChanged(Location location) { longitute = location.getLongitude(); mTextViewLongtitude.setText(""+longitute); latitude = location.getLatitude(); mTextViewLatitude.setText(""+latitude); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } }
获取LocationProvider
获取所有的LocationProvider
一直说我们的手机上有三种位置提供器也不太靠谱,下面我们来获得一下这三种位置提供器。
我们通过LocationManager对象调用getProviders(true)方法可以获得所有已开启的位置提供器,通过调用getAllProviders()方法可以获得所有的设备中的位置提供器。这里我们通过该方法获得设备的位置提供器,然后循环输出下:
List<String> pros = manager.getAllProviders();for (String pro:pros) { Log.d("data", ""+pro);//输出所有的位置提供器}
获取最好的LocationProvider
有时候家人问我们晚饭吃什么,我们可能不清楚自己到底具体想吃什么,但是我们清楚的知道我们不吃什么,我们可以通过告诉家人我们不喜欢吃什么,然后他们依据这些来给我们做最适合的晚餐。
在使用位置提供器是我们想要最好最适合的,我们如何获得呢?
想要筛选出最适合的位置提供器,我们就要使用一个类Criteria。先看这个类的相关介绍:
A class indicating the application criteria for selecting a location provider. Providers maybe ordered according to accuracy, power usage, ability to report altitude, speed, and bearing, and monetary cost.
Criteria是一个通过设定相关的信息,例如:精度,电量使用, 海拔高度是否提供,速度,方位以及是否收费等功能来筛选出Provider。
- setAccuracy(int accuracy):设置精度要求,有两种:ACCURACY_COARSE,ACCURACY_FINE。
- setPowerRequirement(int level):设置电量水平。
- setAltitudeRequired(boolean altitudeRequired):设置是否提供海拔。
- setSpeedRequired(boolean speedRequired):设置是否需要速度。
setCostAllowed(boolean costAllowed):设置是否产生费用。
除此之外还有很多方法,这里我们只列举这些,具体可以去API查询。
//首先生成一个Criteria的对象 Criteria criteria = new Criteria(); //设置查询的条件 criteria.setAccuracy(Criteria.ACCURACY_FINE);//设置精度要求为高 criteria.setPowerRequirement(Criteria.POWER_LOW);//设置电量要求为低 criteria.setAltitudeRequired(false);//不需要还把要求 criteria.setSpeedRequired(false);//不需要速度 criteria.setCostAllowed(false);//不需要产生费用 //第二个参数传入false代表从没打开的定位设备选取,为true则要从已经打开的定位设备中选取。 String bestProvider = manager.getBestProvider(criteria, false); Log.d("data", ""+bestProvider);
- Android 位置服务——用户定位User Location
- Android位置服务--用户定位Location
- Android 之用户定位(User Location)
- Android之用户定位(User Location)二
- Android - 位置定位(Location)服务(Service)类的基本操作
- User Location获取用户当前的位置
- android获得用户位置(Obtaining User Location) android文档翻译
- Android 定位服务(Location-Based Services)
- Android GPS —— Location定位
- 用户定位location
- Android 位置服务与GPS实时定位
- Android位置服务--百度定位,获取自己的位置
- Location 定位获取用户许可
- Android开发--用户定位服务--UserLocation
- 用户位置定位
- 【Android】Facebook获取 user location
- android定位服务:查看位置源及其属性
- android位置服务与GPS实时定位工具类
- 替代sql in 性能优化
- opencv在C++窗体程序中 导包出错
- 关于网络字节序和主机字节序
- 关于FFTW3和NE10在树莓派2上执行FFT和IFFT的耗时比较
- systemUI之statusbar
- Android 位置服务——用户定位User Location
- 【计蒜客系列】挑战难题373:加密(课后)
- 依赖服务或组无法启动。 异常来自 HRESULT:0x8007042C
- Linux 下的ODBC配置 for mysql
- 51nod1040
- SVN知识点
- C++函数的默认值问题
- mycd命令
- 3.Objective-C 类