zoukankan      html  css  js  c++  java
  • 使用百度地图SDK

    百度地图 SDK升级了,所以就试试这个新版的,发现和以前的又很多不一样的地方,但是熟悉以前的版本改动挺大的,想设置个MapView的各种参数都不知道怎么搞,摸索了很久才有点眉目-_-!

    尤其是百度的API文档,简直让人抓狂...

    实现功能:使用自定义的Fragment作为百度地图,可以自动定位,手动定位,定位标志等等..

    还可以实现更多的功能...

    首先下载好百度地图的最新SDK  定位SDKv4.2   ,   地图SDKv3.0.0

    按照官方说明,下载好sdk,导入工程

    需要先到百度控制台申请ak,然后再 manifest中添加各种权限和ak配置,Service

    直接上代码了

    java

      1 /**
      2  * 
      3  */
      4 package cn.edu.hstc.xszn.ui;
      5 
      6 import android.annotation.SuppressLint;
      7 import android.content.Context;
      8 import android.os.Bundle;
      9 import android.support.v4.app.Fragment;
     10 import android.view.LayoutInflater;
     11 import android.view.View;
     12 import android.view.View.OnClickListener;
     13 import android.view.ViewGroup;
     14 import android.widget.ImageButton;
     15 import android.widget.TextView;
     16 import android.widget.Toast;
     17 import cn.edu.hstc.xszn.R;
     18 import cn.edu.hstc.xszn.common.L;
     19 
     20 import com.baidu.location.BDLocation;
     21 import com.baidu.location.BDLocationListener;
     22 import com.baidu.location.LocationClient;
     23 import com.baidu.location.LocationClientOption;
     24 import com.baidu.location.LocationClientOption.LocationMode;
     25 import com.baidu.mapapi.SDKInitializer;
     26 import com.baidu.mapapi.map.BaiduMap;
     27 import com.baidu.mapapi.map.BaiduMap.OnMyLocationClickListener;
     28 import com.baidu.mapapi.map.InfoWindow;
     29 import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener;
     30 import com.baidu.mapapi.map.MapStatus;
     31 import com.baidu.mapapi.map.MapStatusUpdate;
     32 import com.baidu.mapapi.map.MapStatusUpdateFactory;
     33 import com.baidu.mapapi.map.MapView;
     34 import com.baidu.mapapi.map.MyLocationConfigeration;
     35 import com.baidu.mapapi.map.MyLocationData;
     36 import com.baidu.mapapi.model.LatLng;
     37 
     38 /**
     39  * @Description
     40  * @author act262
     41  * @version 1.0
     42  * @since 2014-6-27 上午10:49:39
     43  * 
     44  */
     45 @SuppressLint("ValidFragment")
     46 public class FragmentCampusBaiduMap extends Fragment {
     47 
     48     /** 定位按钮 */
     49     private ImageButton locateButton;
     50     /** 地图View */
     51     private MapView mapView = null;
     52     /** 百度地图的实体 */
     53     private BaiduMap baiduMap = null;
     54     /** 百度定位核心 */
     55     private LocationClient locationClient = null;
     56     /** 位置变化监听 */
     57     private LocationListener listener;
     58     /** 当前定位的数据 */
     59     private MyLocationData locationData;
     60     /** 弹出窗覆盖物 */
     61     private InfoWindow infoWindow;
     62     /** 显示当前位置的信息小窗口 */
     63     private View tipView;
     64     /** 显示在小窗口上的文字 */
     65     private TextView tipTextView;
     66 
     67     /** 首次定位 */
     68     private boolean isFirstLocate = true;
     69 
     70     private final String TAG = this.getClass().getSimpleName();
     71 
     72     public static FragmentCampusBaiduMap getInstance(Context context) {
     73         return new FragmentCampusBaiduMap(context);
     74     }
     75 
     76     public FragmentCampusBaiduMap(Context context) {
     77         // 使用百度map时必须的初始化工作
     78         SDKInitializer.initialize(context);
     79     }
     80 
     81     @Override
     82     public void onCreate(Bundle arg0) {
     83         super.onCreate(arg0);
     84         L.d(TAG, "onCreate");
     85     }
     86 
     87     @Override
     88     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle arg2) {
     89         L.d(TAG, "onCreateView");
     90         View rootView = inflater.inflate(R.layout.fragment_campus_baidumap, null);
     91         mapView = (MapView) rootView.findViewById(R.id.mapView_fragment_campus_baidumap);
     92         locateButton = (ImageButton) rootView.findViewById(R.id.ib_fragment_campus_baidumap_locate);
     93         locateButton.setOnClickListener(new OnClickListener() {
     94             public void onClick(View v) {
     95                 requestLocate(); // 手动请求定位
     96             }
     97         });
     98 
     99         // 初始化小窗口
    100         tipView = inflater.inflate(R.layout.view_fragment_campus_baidumap_location_tip, null);
    101         tipTextView = (TextView) tipView.findViewById(R.id.tv_view_fragment_campus_baidumap_location_tip);
    102         return rootView;
    103     }
    104 
    105     // 手动请求定位
    106     private void requestLocate() {
    107         Toast.makeText(getActivity(), "正在定位...", Toast.LENGTH_SHORT).show();
    108         if (locationClient != null && locationClient.isStarted()) {
    109             locationClient.requestLocation();
    110         } else {
    111             Toast.makeText(getActivity(), "定位失败", Toast.LENGTH_SHORT).show();
    112         }
    113     }
    114 
    115     boolean isShowInfoWindow = false;
    116 
    117     private void initMap() {
    118         baiduMap = mapView.getMap();
    119         baiduMap.setOnMyLocationClickListener(new OnMyLocationClickListener() {
    120 
    121             @Override
    122             public boolean onMyLocationClick() {
    123                 if (isShowInfoWindow) {
    124                     isShowInfoWindow = false;
    125                     baiduMap.hideInfoWindow();
    126                 } else {
    127                     isShowInfoWindow = true;
    128                     baiduMap.showInfoWindow(infoWindow);
    129                 }
    130                 return false;
    131             }
    132         });
    133 
    134         // 开启定位图层
    135         baiduMap.setMyLocationEnabled(true);
    136         // 设置百度地图的一些状态,放大等级,
    137         baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder(baiduMap.getMapStatus()).zoom(16).build())); // 设置放大等级为16
    138         // 配置定位图层显示方式,一定要开启了定位图层后再设置
    139         baiduMap.setMyLocationConfigeration(new MyLocationConfigeration(MyLocationConfigeration.LocationMode.FOLLOWING, true, null)); // 设置为跟随模式,显示手机方向的箭头
    140 
    141         locationClient = new LocationClient(getActivity().getApplicationContext());
    142         listener = new LocationListener();
    143         locationClient.registerLocationListener(listener); // 注册位置监听器
    144 
    145         // 定位参数控制
    146         LocationClientOption option = new LocationClientOption();
    147         option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
    148         option.setOpenGps(true); // 打开GPS
    149         option.setTimeOut(10 * 1000); // 超时
    150         option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
    151         option.setScanSpan(60 * 1000);// 设置发起定位请求的间隔时间为5000ms,将自动发起请求
    152         option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
    153         option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
    154         locationClient.setLocOption(option);
    155 
    156     }
    157 
    158     @Override
    159     public void onStart() {
    160         super.onStart();
    161         initMap();
    162         locationClient.start(); // 启动定位,发起第一次自动请求
    163     }
    164 
    165     @Override
    166     public void onResume() {
    167         // MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()
    168         mapView.onResume();
    169         super.onResume();
    170     }
    171 
    172     @Override
    173     public void onPause() {
    174         mapView.onPause();
    175         super.onPause();
    176     }
    177 
    178     @Override
    179     public void onDestroy() {
    180         if (locationClient != null) {
    181             locationClient.stop(); // 退出停止定位
    182         }
    183         baiduMap.setMyLocationEnabled(false); // 关闭定位图层
    184         mapView.onDestroy();
    185         mapView = null;
    186         super.onDestroy();
    187     }
    188 
    189     private class LocationListener implements BDLocationListener {
    190 
    191         private void initInfoWindow(LatLng point) {
    192             OnInfoWindowClickListener infoWindowClickListener = new OnInfoWindowClickListener() {
    193                 @Override
    194                 public void onInfoWindowClick() {
    195                     baiduMap.hideInfoWindow();
    196                     isShowInfoWindow = false;
    197                 }
    198             };
    199             infoWindow = new InfoWindow(tipView, point, infoWindowClickListener);
    200         }
    201 
    202         @Override
    203         public void onReceiveLocation(BDLocation location) {
    204             L.d(TAG, "onReceiveLocation");
    205             if (location == null) {
    206                 return;
    207             }
    208             StringBuffer sb = new StringBuffer(256);
    209             sb.append("time : ");
    210             sb.append(location.getTime());
    211             sb.append("
    error code : ");
    212             sb.append(location.getLocType()); // 定位方式
    213             sb.append("
    latitude : ");
    214             sb.append(location.getLatitude()); // 纬度
    215             sb.append("
    lontitude : ");
    216             sb.append(location.getLongitude()); // 经度
    217             sb.append("
    radius : ");
    218             sb.append(location.getRadius()); // 定位精度
    219             sb.append("
    direction : ");
    220             sb.append(location.getDirection()); // 手机当前方向
    221             sb.append("
    altitude : ");
    222             sb.append(location.getAltitude()); // 高度
    223             sb.append("speed : ");
    224             sb.append(location.getSpeed()); // 速度
    225             sb.append("
    operators : ");
    226             sb.append(location.getOperators());
    227             if (location.getLocType() == BDLocation.TypeGpsLocation) {
    228                 sb.append("
    speed : ");
    229                 sb.append(location.getSpeed());
    230                 sb.append("
    satellite : ");
    231                 sb.append(location.getSatelliteNumber()); // 卫星数
    232             } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
    233                 sb.append("
    addr : ");
    234                 sb.append(location.getAddrStr()); // 详细地址信息
    235                 sb.append("
    province:");
    236                 sb.append(location.getProvince()); //
    237                 sb.append("
    city:");
    238                 sb.append(location.getCity()); // 城市
    239                 sb.append("
    district:");
    240                 sb.append(location.getDistrict()); // 区县
    241             }
    242             L.d(TAG, sb.toString());
    243 
    244             locationData = new MyLocationData.Builder().accuracy(location.getRadius()) // 定位的精确度
    245                     .direction(location.getDirection()) // 定位的方向 0~360度
    246                     .latitude(location.getLatitude()).longitude(location.getLongitude()) // 经纬度
    247                     .speed(location.getSpeed()).build();
    248 
    249             // 设置定位数据到定位图层上,就是显示当前位置的那个点和圆圈
    250             baiduMap.setMyLocationData(locationData);
    251 
    252             LatLng point = new LatLng(location.getLatitude(), location.getLongitude());
    253             // 我的地理位置
    254             String myPosition = "我的位置
    " + location.getAddrStr();
    255 
    256             // 第一次进入百度地图
    257             if (isFirstLocate) {
    258                 isFirstLocate = false;
    259                 // 移动到我的位置
    260                 // baiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(point),
    261                 // 600); // 默认动画效果时间300ms
    262             }
    263 
    264             // 基于原来的status上改变指定的参数
    265             MapStatus mapStatus = new MapStatus.Builder(baiduMap.getMapStatus()).target(point).build();
    266             MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus);
    267             baiduMap.animateMapStatus(mapStatusUpdate); // 改变,这里设置成随着移动而改变位置
    268 
    269             // 显示小窗口信息
    270             if (location.getAddrStr().length() > 0) {
    271                 initInfoWindow(point);
    272 
    273                 tipTextView.setText("" + myPosition);
    274                 isShowInfoWindow = true;
    275                 // 设置显示我的位置
    276                 baiduMap.showInfoWindow(infoWindow); // 显示
    277             }
    278         }
    279     }
    280 
    281 }
    View Code

    Fragment的布局.xml

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent" >
     5 
     6     <!-- 百度地图的 MapView -->
     7 
     8     <com.baidu.mapapi.map.MapView
     9         android:id="@+id/mapView_fragment_campus_baidumap"
    10         android:layout_width="match_parent"
    11         android:layout_height="match_parent"
    12         android:clickable="true" />
    13 
    14     <!-- 手动定位按钮 -->
    15 
    16     <ImageButton
    17         android:id="@+id/ib_fragment_campus_baidumap_locate"
    18         android:layout_width="wrap_content"
    19         android:layout_height="wrap_content"
    20         android:layout_alignParentRight="true"
    21         android:layout_alignParentTop="true"
    22         android:layout_marginRight="25dp"
    23         android:layout_marginTop="10dp"
    24         android:background="@drawable/ic_baidumap_locate" />
    25 
    26 </RelativeLayout>

    tip弹窗布局.xml

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <!-- 我的位置提示 -->
     3 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     4     android:layout_width="wrap_content"
     5     android:layout_height="wrap_content" >
     6 
     7     <TextView
     8         android:id="@+id/tv_view_fragment_campus_baidumap_location_tip"
     9         android:layout_width="wrap_content"
    10         android:layout_height="wrap_content"
    11         android:background="@drawable/bg_location_tips"
    12         android:gravity="center"
    13         android:textColor="@android:color/white"
    14         android:textSize="16sp" />
    15 
    16 </FrameLayout>

    在MainActivity中使用这个Fragment就好了

    运行效果图

  • 相关阅读:
    773. 有效的字母异位词
    768. 杨辉三角
    759. 时间角度
    757. 最短无序数组
    749. 约翰的后花园
    737. 查找矩阵
    AIX如何点亮HBA卡
    Spring Boot 静态文件,请求不到,util文件夹
    Spring Boot 静态文件,请求不到,util文件夹
    Bootstrap表格组件 Bootstrap Table
  • 原文地址:https://www.cnblogs.com/act262/p/3812840.html
Copyright © 2011-2022 走看看