zoukankan      html  css  js  c++  java
  • 定位到我的位置

     

    在实现定位到我的位置时,首先要开启定位图层,可以使用com.baidu.mapapi.map.BaiduMap 对象的setMyLocationEnabled()方法实现。该方法的语法格式如下:

    Public final void set MyLocationEnabled(boolean enabled)

    其中,enabled参数用于指定是否允许定位图层,值为true时表示允许,否则为不允许。

    开启定位图层的代码如下:

    mBaiduMap.setMyLocationEnabled(true); 

    然后创建MyLocationData对象,用于构造定位数据,包括GPS定位时方向角度、纬度坐标、经度坐标、定位精度和时速等。例如,构造定位数据,指定GPS定位时方向角度为100、坐标位置为当前位置,可以使用下面的代码。

    01     MyLocationData locData = new MyLocationData.Builder().
    02             accuracy(location.getAccuracy())    //设置精度
    03             .direction(100)                     //此处设置开发者获取到的方向信息,顺时针0-360
    04             .latitude(location.getLatitude())   //设置纬度坐标
    05             .longitude(location.getLongitude()) //设置经度坐标
    06             .build();

    说明:此处代码将使用Android原有定位方法。

    再设置定位数据,并配置定位图层的一些信息。代码如下:

    01     mBaiduMap.setMyLocationData(locData);
    02     //设置自定义定位图标
    03     BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
    04             .fromResource(R.drawable.icon_geo);
    05     mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;      //设置定位模式
    06     //位置构造方式,将定位模式,定义图标添加其中
    07     MyLocationConfiguration config = new
     MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);
    08     mBaiduMap.setMyLocationConfigeration(config);                 //地图显示定位图标

    最后,在不需要定位图层时关闭定位图层。代码如下:

    mBaiduMap.setMyLocationEnabled(false);                                 //关闭定位图层

    下面通过一个实例来演示如何在百度地图上定位我的位置。

    实例 百度地图定位我的位置

    说明:该实例在本章实例06基础上进行修改。

    在Android Studio中创建Module,名称为“My Location”。在该Module中实现本实例,具体步骤如下。

    (1)打开主活动MainActivity,在该文件中声明所需成员变量,关键代码如下:

    01     private MapView mMapView;                                   //百度地图组件
    02     private BaiduMap mBaiduMap;                                 //定义百度地图对象
    03     private boolean isFirstLoc = true;                          //定义第一次启动
    04     private MyLocationConfiguration.LocationMode mCurrentMode;  //定义当前定位模式

    (2)在MainActivity的onCreate()方法中,获取系统的LocationManager对象,关键代码如下:

    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    (3)在onCreate()方法中,通过locationManager.requestLocationUpdates()方法与位置监听器来设置每秒获取一次location信息,并将最新的定位信息传递给创建的locationUpdates()方法中。关键代码如下:

    01   //设置每秒获取一次location信息
    
    02   locationManager.requestLocationUpdates(
    
    03           LocationManager.GPS_PROVIDER,      //GPS定位提供者
    
    04           1000,                              //更新数据时间为1秒
    
    05           1,                                 //位置间隔为1米
    
    06           //位置监听器
    
    07           new LocationListener() {           //GPS定位信息发生改变时触发,用于更新位置信息
    
    08               @Override
    
    09               public void onLocationChanged(Location location) {
    
    10                   //GPS信息发生改变时,更新位置
    
    11                   locationUpdates(location);
    
    12               }
    
    13               @Override
    
    14               //位置状态发生改变时触发
    
    15               public void onStatusChanged(String provider, int status, Bundle extras) {
    
    16               }
    
    17               @Override
    
    18               //定位提供者启动时触发
    
    19               public void onProviderEnabled(String provider) {
    
    20               }
    
    21               @Override
    
    22               //定位提供者关闭时触发
    
    23               public void onProviderDisabled(String provider) {
    
    24               }
    
    25           });
    
    26   //从GPS获取最新的定位信息
    
    27   Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    
    28   locationUpdates(location);        //将最新的定位信息传递给创建的locationUpdates()方法中

    说明:添加上的代码后,在代码的下方将出现红色浪线,此时按下〈Alt+Enter〉键,然后选择Add Permission ACCESS_FINE_LOCATION选项,添加该权限解决红色浪线问题。此时,Android Studio将自动添加以下权限检查的代码。

    01   if (ActivityCompat.checkSelfPermission(this,
    
     Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
    
       && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
    
      != PackageManager.PERMISSION_GRANTED) {
    
    02       return;
    
    03   }

    (4)在MainActivity中,创建locationUpdates()方法,用于获取当前的经纬度,并设置定位。当获取的信息不为空时,首先设置第一次定位的中心点为当前位置,然后构造和设置定位数据,最后在地图上显示定位图标。关键代码如下:

    01   public void locationUpdates(Location location) {                      //获取指定的查询信息
    
    02       //如果location不为空时
    
    03       if (location != null) {
    
    04           //获取用户当前经纬度
    
    05           LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
    
    06          Log.i("Location","纬度:"+location.getLatitude()+" | 经度:"+location.getLongitude());
    
    07           if (isFirstLoc) {  //如果是第一次定位,就定位到以自己为中心
    
    08               MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);  //更新坐标位置
    
    09               mBaiduMap.animateMapStatus(u);                             //设置地图位置
    
    10               isFirstLoc = false;                                        //取消第一次定位
    
    11           }
    
    12           //构造定位数据
    
    13           MyLocationData locData = new MyLocationData.Builder().
    
    14                   accuracy(location.getAccuracy())                       //设置精度
    
    15                   .direction(100)        // 此处设置开发者获取到的方向信息,顺时针0~360
    
    16                   .latitude(location.getLatitude())                      //设置纬度坐标
    
    17                   .longitude(location.getLongitude())                    //设置经度坐标
    
    18                   .build();
    
    19           //设置定位数据
    
    20           mBaiduMap.setMyLocationData(locData);
    
    21           //设置自定义定位图标
    
    22           BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
    
    23                   .fromResource(R.drawable.icon_geo);
    
    24           mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;    //设置定位模式
    
    25           //位置构造方式,将定位模式,定义图标添加其中
    
    26           MyLocationConfiguration config = new
    
     MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);
    
    27           mBaiduMap.setMyLocationConfigeration(config);                  //地图显示定位图标
    
    28       } else {
    
    29           //否则输出空信息
    
    30           Log.i("Location","没有获取到GPS信息");
    
    31       }
    
    32   }

    (5)重写Activity的onStart()方法和onStop()方法,在onStart()方法中启动地图定位,在onStop()方法中停止地图定位。关键代码如下:

    01   @Override
    
    02   protected void onStart() {                 //启动地图定位
    
    03       super.onStart();
    
    04       mBaiduMap.setMyLocationEnabled(true);  //启动定位图层
    
    05   }
    
    06   @Override
    
    07   protected void onStop() {                   //停止地图定位
    
    08       super.onStop();
    
    09       mBaiduMap.setMyLocationEnabled(false);  //关闭定位图层
    
    10   }

    (6)在AndroidManifest.xml文件中,添加以下代码设置访问LocationProvider的相关权限,具体代码如下:

    01   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    
    02   <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

    (7)在工具栏中找到下拉列表框,选择要运行的应用(这里为My Location),再单击右侧的按钮,运行效果如图14.24所示。

     

    图14.24  在百度地图上显示我的位置

    说明:运行本实例需要在手机中进入 “设置”→“应用”→你的App应用名称→“权限”开启位置权限,即可进行定位。

     

    本文摘自明日科技出版的《零基础学Android》,转载请注明出处!!!

     

  • 相关阅读:
    WP7备注(13)(独立储存)
    WP7备注(14)(ContentPropertyAttribute)
    WP7备注(11)(页面跳转)
    WP7备注(10)(Accelerometer+GeoCoordinateWatcher+Map Service)
    WP7备注(12)(页面数据共享)
    WP7备注(18)(OpacityMask)
    WP7备注(15)(Resources)
    WP7备注(19)(ImageBrush|VideoBrush)
    WP7备注(17)(TextBlock和Inlines)
    vmware 复制其他电脑的linux无法上网问题
  • 原文地址:https://www.cnblogs.com/mrxy/p/8028619.html
Copyright © 2011-2022 走看看