人生就像弈棋,一步失误,全盘皆输。


本讲内容:位置的服务


步骤:

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


更多相关文章

  1. android scheme 跳转应用 如何获取intent传的参数
  2. 【Android】安卓环境变量配置
  3. Android编译系统 - pathmap.mk(宏)
  4. android中短信协议与字段
  5. android 数据库 sqlite 操作
  6. android通过HTTP协议上传文件至远程服务器
  7. android中AppWidgetManager
  8. Android下使用Logcat打印信息
  9. Android工作学习笔记之SpannableString

随机推荐

  1. android 使用Kotlin operator 泛型属性委
  2. Flutter框架的安装与环境配置
  3. Android(安卓)jetpack最佳总结和实践
  4. Android学习记录
  5. 还在等着吃Android(安卓)Oreo?Android(安
  6. Android适配(三)适配不同的系统版本
  7. Android——Activity的生命周期
  8. app测试中,ios和android的区别
  9. Android(安卓)十年之路: 主屏与导航
  10. 牛掰了!鸿蒙与Android完美融合,将鸿蒙设备