Android之位置的服务
本讲内容:位置的服务
步骤:
1、获取LocationManager实例
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
2、选择一个位置提供器来确定设备当前的位置,Android中有三种位置提供器可供选择,GPS_PROVIDER、NETWORK_PROVIDER和PASSIVE_PROVIDER。其中前两种使用的比较多,分别表示使用GPS定位和使用网络定位。
String provider = LocationManager.NETWORK_PROVIDER
3、将选择好的提供器传入到getLastKnownLocation()方法中就可以得到一个Location对象,这个Location对象包含了经度、纬度、海拔等一系列的位置信息。
Location location = locationManager.getLastKnownLocation(provider);
如果有些时候你想让定位的精度尽量高一些,但又不确定GPS定位的功能是否已经启用,可以先判断有哪些位置提供器可用。如下:
List<String> providerList = locationManager.getProviders(true);
true表示只有启用的位置提供器才会被返回
注意:定位功能必须要由用户主动去启用才行,不然任务应用程序都无法获取到手机当前的位置信息。(进入手机的设置--定位服务)
4、调用getLastKnownLocation()方法虽然可以获取到设备当前的位置信息,但是用户是完全有可能带着设备随时移动的,对此,LocationManager提供了一个requestLocationUpdates()方法来更新位置信息。该方法接收四个参数:
第一个参数是:位置提供器的类型
第二个参数是:监听位置变化的时间间隔,以毫秒为单位
第三个参数是:监听位置变化的距离间隔,以米为单位
第四个参数是:LocationListener监听器
譬如:
locationManager.requestLocationUpdates(provider, 5000, 1,locationListener);
LocationManager每隔5秒钟会检测一下位置的变化情况,当移动距离超过10米的时候,就会调用LocationListener的
onLocationChanged()方法,并把新的位置信息作为参数传入。
示例一:
下面是res/layout/activity_main.xml 布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/id_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="25sp"/></RelativeLayout>
下面是MainActivity.java主界面文件:
public class MainActivity extends Activity {private TextView tv;private LocationManager locationManager;private String provider;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initViews();}private void initViews() {tv = (TextView) findViewById(R.id.id_tv);locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);// 获取所有可用的位置提供器(这里优先使用GPS)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(this, "没有可用的位置提供器", Toast.LENGTH_LONG).show();return;}Location location = locationManager.getLastKnownLocation(provider);if (location != null) {// 更新当前设备的位置信息showLocation(location);}locationManager.requestLocationUpdates(provider, 5000, 10,locationListener);}protected void onDestroy() {super.onDestroy();if (locationManager != null) {// 关闭程序时将监听器移除,以保证不会继续耗费电locationManager.removeUpdates(locationListener);}}LocationListener locationListener = new LocationListener() {/** * 此方法在Provider的状态在可用、暂时不可用和无服务三个状态直接切换时被调用 * 参数: * provider 与之关联的location provider名称。 * status 如果服务已停止,并且在短时间内不会改变,状态码为OUT_OF_SERVICE;如果服务暂时停止, * 并且在短时间内会恢复,状态码为TEMPORARILY_UNAVAILABLE;如果服务正常有效,状态码为AVAILABLE。 * extras 一组可选参数,其包含provider的特定状态。 */public void onStatusChanged(String provider, int status, Bundle extras) {}/** * 此方法在provider被用户开启后调用 * 参数:provider 与之关联的location provider名称 */public void onProviderEnabled(String provider) {}/** * 此方法在provider被用户关闭后被调用 * 参数:provider 与之关联的location provider名称 */public void onProviderDisabled(String provider) {}/** * 此方法在当位置发生改变后被调用 * 参数:location 位置发生变化后的新位置 */public void onLocationChanged(Location location) {// 更新当前设备的位置信息showLocation(location);}};private void showLocation(Location location){String currentPosition="纬度是: "+location.getLatitude()+"\n"+"经度是: "+location.getLongitude();tv.setText(currentPosition);}}
添加获取设备当前的位置信息权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
示例二:反向地理编码
示例一中我们成功获取到了设备当前位置的经纬度信息,但我们看不懂,通过反向地理编码将经纬度转换成看得懂的信息。
1、谷歌给我们提供了一套Geocoding API,使用它可以完成反向地理编码的工作,Geocoding API的工作原理:是我们可以向谷歌的服务器发起一条HTTP请求,并将经纬度的值作为参数一同传递过去,然后服务器会帮我们将这个经纬度转换成看得懂的位置信息,再将这些信息返回给手机端,最后手机端去解析服务器返回的信息,并进行处理。
Take your time and enjoy it
更多相关文章
- android scheme 跳转应用 如何获取intent传的参数
- 【Android】安卓环境变量配置
- Android编译系统 - pathmap.mk(宏)
- android中短信协议与字段
- android 数据库 sqlite 操作
- android通过HTTP协议上传文件至远程服务器
- android中AppWidgetManager
- Android下使用Logcat打印信息
- Android工作学习笔记之SpannableString