美文网首页
百度地图

百度地图

作者: 初昇陌 | 来源:发表于2019-03-10 14:32 被阅读0次

    1.权限

    <!-- 这个权限用于进行网络定位 -->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <!-- 这个权限用于访问GPS定位 -->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    
        <!--//获取设备网络状态,禁用后无法获取网络状态-->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <!--//网络权限,当禁用后,无法进行检索等相关业务-->
        <uses-permission android:name="android.permission.INTERNET" />
        <!--//读取设备硬件信息,统计数据-->
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <!--//读取系统信息,包含系统版本等信息,用作统计-->
        <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
        <!--//获取设备的网络状态,鉴权所需网络代理-->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <!--//允许sd卡写权限,需写入地图数据,禁用后无法显示地图-->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <!--//这个权限用于进行网络定位-->
        <uses-permission android:name="android.permission.WRITE_SETTINGS"
            tools:ignore="ProtectedPermissions" />
        <!--//这个权限用于访问GPS定位-->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <!--//获取统计数据-->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <!--//使用步行AR导航,配置Camera权限-->
        <uses-permission android:name="android.permission.CAMERA" />
        <!--//程序在手机屏幕关闭后后台进程仍然运行-->
        <uses-permission android:name="android.permission.WAKE_LOCK" />
    
    
    <application>
             <meta-data
                android:name="com.baidu.lbsapi.API_KEY"
                android:value="填写自己的key" />
    
            <service android:name="com.baidu.location.f"
                android:enabled="true"
                android:process=":remote"/>
     </application>
    

    2.添加assets

    在百度上拷贝
    assets
    drawable
    

    3.初始化___在清单文件中添加--------android:name=".BaseApp"

    public class BaseApp extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            //在使用SDK各组件之前初始化context信息,传入ApplicationContext
            SDKInitializer.initialize(this);
            //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
            //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
            SDKInitializer.setCoordType(CoordType.BD09LL);
        }
    }
    

    4.在build文件中

    sourceSets {
            main {
                jniLibs.srcDir 'libs'
            }
        }
    
        signingConfigs {
            debug {
                storeFile file('asd.jks')
                storePassword "123123"
                keyAlias "qwe"
                keyPassword "123123"
            }
        }
    

    5.布局

    <com.baidu.mapapi.map.MapView
            android:id="@+id/bmapView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clickable="true" />
    

    6.在主页面

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initPer();
            //获取地图控件引用
            mMapView = (MapView) findViewById(R.id.bmapView);
            map = mMapView.getMap();
            initView();
            map.setMyLocationEnabled(true);
            load();
            initListener();
        }
    
       private void initListener() {
            BaiduMap.OnMapClickListener listener = new BaiduMap.OnMapClickListener() {
                /**
                 * 地图单击事件回调函数
                 *
                 * @param point 点击的地理坐标
                 */
                @Override
                public void onMapClick(LatLng point) {
                    mEndLatlng = point;
                    addMarker(point);
                }
    
                /**
                 * 地图内 Poi 单击事件回调函数
                 *
                 * @param mapPoi 点击的 poi 信息
                 */
                @Override
                public boolean onMapPoiClick(MapPoi mapPoi) {
                    return false;
                }
            };
            //设置地图单击事件监听
            map.setOnMapClickListener(listener);
        }
    
       private void load() {
            if (mLocationClient == null) {
                //定位初始化
                mLocationClient = new LocationClient(this);
    
                //通过LocationClientOption设置LocationClient相关参数
                LocationClientOption option = new LocationClientOption();
                option.setOpenGps(true); // 打开gps
                option.setCoorType("bd09ll"); // 设置坐标类型
                option.setScanSpan(1000);
    
    //设置locationClientOption
                mLocationClient.setLocOption(option);
    
                //注册LocationListener监听器
                MyLocationListener myLocationListener = new MyLocationListener();
                mLocationClient.registerLocationListener(myLocationListener);
    //开启地图定位图层
            }
            mLocationClient.start();
        }
    
    @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.bt:
    //定位
                    getlocation();
                    break;
                case R.id.srech:
                    LatLng point = new LatLng(39.963175, 116.400244);
                    addMarker(point);
                    getsrech();
                    break;
            }
        }
    
    private void getsrech() {
            String str = ed.getText().toString().trim();
            if (TextUtils.isEmpty(str)){
                return;
            }
            mPoiSearch.setOnGetPoiSearchResultListener(listener);
            mPoiSearch.searchNearby(new PoiNearbySearchOption()
                    .location(new LatLng(mlocation.getLatitude(), mlocation.getLongitude()))
                    .radius(10000)
                    .keyword(str)
                    .pageNum(10));
        }
    
    private void addMarker(LatLng point) {
            map.clear();
            //定义Maker坐标点
            //LatLng point = new LatLng(39.963175, 116.400244);
    //构建Marker图标
            BitmapDescriptor bitmap = BitmapDescriptorFactory
                    .fromResource(R.drawable.icon_en);
    //构建MarkerOption,用于在地图上添加Marker
            OverlayOptions option = new MarkerOptions()
                    .position(point)
                    .title("公共厕所")
                    .icon(bitmap);
    //在地图上添加Marker,并显示
            map.addOverlay(option);
        }
    
    OnGetPoiSearchResultListener listener = new OnGetPoiSearchResultListener() {
            @Override
            public void onGetPoiResult(PoiResult poiResult) {
                if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {
                    map.clear();
    
                    //创建PoiOverlay对象
                    PoiOverlay poiOverlay = new PoiOverlay(map);
    
                    //设置Poi检索数据
                    poiOverlay.setData(poiResult);
    
                    //将poiOverlay添加至地图并缩放至合适级别
                    poiOverlay.addToMap();
                    poiOverlay.zoomToSpan();
                }
            }
            @Override
            public void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) {
    
            }
            @Override
            public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
    
            }
            //废弃
            @Override
            public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
    
            }
        };
    
    public class MyLocationListener extends BDAbstractLocationListener {
            @Override
            public void onReceiveLocation(BDLocation location) {
                //mapView 销毁后不在处理新接收的位置
                mlocation = location;
                if (location == null || mMapView == null) {
                    return;
                }
                MyLocationData locData = new MyLocationData.Builder()
                        .accuracy(location.getRadius())
                        // 此处设置开发者获取到的方向信息,顺时针0-360
                        .direction(location.getDirection()).latitude(location.getLatitude())
                        .longitude(location.getLongitude()).build();
                map.setMyLocationData(locData);
            }
        }
    
    private void getlocation() {
            LatLng latLng = new LatLng(mlocation.getLatitude(), mlocation.getLongitude());
            //改变地图手势的中心点
            map.setMapStatus(MapStatusUpdateFactory.newLatLng(latLng));
        }
    
    private void initPer() {
            String[] per = new String[]{
                    Manifest.permission.READ_PHONE_STATE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.CAMERA
            };
    
            ActivityCompat.requestPermissions(this, per, 100);
        }
    
    @Override
        protected void onResume() {
            super.onResume();
            //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
            mMapView.onResume();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
            mMapView.onPause();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
            mMapView.onDestroy();
            mPoiSearch.destroy();
        }
    
    private void initView() {
            bt = (ImageButton) findViewById(R.id.bt);
            bt.setOnClickListener(this);
            ed = (EditText) findViewById(R.id.ed);
            ed.setOnClickListener(this);
            srech = (ImageButton) findViewById(R.id.srech);
            srech.setOnClickListener(this);
    
            mPoiSearch = PoiSearch.newInstance();
    
            map.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
                //marker被点击时回调的方法
                //若响应点击事件,返回true,否则返回false
                //默认返回false
                @Override
                public boolean onMarkerClick(Marker marker) {
                    String title = marker.getTitle();
                    if (!TextUtils.isEmpty(title)){
                        showToast(title);
                    }
                    //步行导航
                    walkNavi();
                    return false;
                }
            });
        }
    
    private void walkNavi() {
            WalkNavigateHelper.getInstance().initNaviEngine(this, new IWEngineInitListener() {
    
                @Override
                public void engineInitSuccess() {
                    //引擎初始化成功的回调
                    routeWalkPlanWithParam();
                }
    
                @Override
                public void engineInitFail() {
                    //引擎初始化失败的回调
                }
            });
        }
    
    private void routeWalkPlanWithParam() {
            //起终点位置
            LatLng startPt = new LatLng(mlocation.getLatitude(),mlocation.getLongitude());
            LatLng endPt = mEndLatlng;
    //构造WalkNaviLaunchParam
            WalkNaviLaunchParam mParam = new WalkNaviLaunchParam().stPt(startPt).endPt(endPt);
    
            //发起算路
            WalkNavigateHelper.getInstance().routePlanWithParams(mParam, new IWRoutePlanListener() {
                @Override
                public void onRoutePlanStart() {
                    //开始算路的回调
                }
    
                @Override
                public void onRoutePlanSuccess() {
                    //算路成功
                    //跳转至诱导页面
                    Intent intent = new Intent(MainActivity.this, WNaviGuideActivity.class);
                    startActivity(intent);
                }
    
                @Override
                public void onRoutePlanFail(WalkRoutePlanError walkRoutePlanError) {
                    //算路失败的回调
                }
            });
        }
    

    7.创建PoiOverlay类

    public class PoiOverlay extends OverlayManager {
    
        private static final int MAX_POI_SIZE = 10;
    
        private PoiResult mPoiResult = null;
    
        /**
         * 构造函数
         * 
         * @param baiduMap   该 PoiOverlay 引用的 BaiduMap 对象
         */
        public PoiOverlay(BaiduMap baiduMap) {
            super(baiduMap);
        }
    
        /**
         * 设置POI数据
         * 
         * @param poiResult    设置POI数据
         */
        public void setData(PoiResult poiResult) {
            this.mPoiResult = poiResult;
        }
    
        @Override
        public final List<OverlayOptions> getOverlayOptions() {
            if (mPoiResult == null || mPoiResult.getAllPoi() == null) {
                return null;
            }
    
            List<OverlayOptions> markerList = new ArrayList<>();
            int markerSize = 0;
    
            for (int i = 0; i < mPoiResult.getAllPoi().size() && markerSize < MAX_POI_SIZE; i++) {
                if (mPoiResult.getAllPoi().get(i).location == null) {
                    continue;
                }
    
                markerSize++;
                Bundle bundle = new Bundle();
                bundle.putInt("index", i);
                markerList.add(new MarkerOptions()
                    .icon(BitmapDescriptorFactory.fromAssetWithDpi("Icon_mark" + markerSize + ".png"))
                    .extraInfo(bundle)
                    .position(mPoiResult.getAllPoi().get(i).location));
                
            }
    
            return markerList;
        }
    
        /**
         * 获取该PoiOverlay的poi数据
         * 
         * @return     POI数据
         */
        public PoiResult getPoiResult() {
            return mPoiResult;
        }
    
        /**
         * 覆写此方法以改变默认点击行为
         * 
         * @param i    被点击的poi在
         *             {@link PoiResult#getAllPoi()} 中的索引
         * @return     true--事件已经处理,false--事件未处理
         */
        public boolean onPoiClick(int i) {
    //        if (mPoiResult.getAllPoi() != null
    //                && mPoiResult.getAllPoi().get(i) != null) {
    //            Toast.makeText(BMapManager.getInstance().getContext(),
    //                    mPoiResult.getAllPoi().get(i).name, Toast.LENGTH_LONG)
    //                    .show();
    //        }
            return false;
        }
    
        @Override
        public final boolean onMarkerClick(Marker marker) {
            if (!mOverlayList.contains(marker)) {
                return false;
            }
    
            if (marker.getExtraInfo() != null) {
                return onPoiClick(marker.getExtraInfo().getInt("index"));
            }
    
            return false;
        }
    
        @Override
        public boolean onPolylineClick(Polyline polyline) {
            return false;
        }
    }
    
    

    8.创建OverlayManager

    public abstract class OverlayManager implements OnMarkerClickListener, OnPolylineClickListener {
    
        BaiduMap mBaiduMap = null;
        private List<OverlayOptions> mOverlayOptionList = null;
    
        List<Overlay> mOverlayList = null;
    
        /**
         * 通过一个BaiduMap 对象构造
         * 
         * @param baiduMap
         */
        public OverlayManager(BaiduMap baiduMap) {
            mBaiduMap = baiduMap;
            // mBaiduMap.setOnMarkerClickListener(this);
            if (mOverlayOptionList == null) {
                mOverlayOptionList = new ArrayList<OverlayOptions>();
            }
            if (mOverlayList == null) {
                mOverlayList = new ArrayList<Overlay>();
            }
        }
    
        /**
         * 覆写此方法设置要管理的Overlay列表
         * 
         * @return 管理的Overlay列表
         */
        public abstract List<OverlayOptions> getOverlayOptions();
    
        /**
         * 将所有Overlay 添加到地图上
         */
        public final void addToMap() {
            if (mBaiduMap == null) {
                return;
            }
    
            removeFromMap();
            List<OverlayOptions> overlayOptions = getOverlayOptions();
            if (overlayOptions != null) {
                mOverlayOptionList.addAll(getOverlayOptions());
            }
    
            for (OverlayOptions option : mOverlayOptionList) {
                mOverlayList.add(mBaiduMap.addOverlay(option));
            }
        }
    
        /**
         * 将所有Overlay 从 地图上消除
         */
        public final void removeFromMap() {
            if (mBaiduMap == null) {
                return;
            }
            for (Overlay marker : mOverlayList) {
                marker.remove();
            }
            mOverlayOptionList.clear();
            mOverlayList.clear();
    
        }
    
        /**
         * 缩放地图,使所有Overlay都在合适的视野内
         * <p>
         * 注: 该方法只对Marker类型的overlay有效
         * </p>
         * 
         */
        public void zoomToSpan() {
            if (mBaiduMap == null) {
                return;
            }
            if (mOverlayList.size() > 0) {
                LatLngBounds.Builder builder = new LatLngBounds.Builder();
                for (Overlay overlay : mOverlayList) {
                    // polyline 中的点可能太多,只按marker 缩放
                    if (overlay instanceof Marker) {
                        builder.include(((Marker) overlay).getPosition());
                    }
                }
                mBaiduMap.setMapStatus(MapStatusUpdateFactory
                        .newLatLngBounds(builder.build()));
            }
        }
    
    }
    

    9.创建WNaviGuideActivity

    public class WNaviGuideActivity extends Activity {
        private WalkNavigateHelper mNaviHelper;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //获取WalkNavigateHelper实例
            mNaviHelper = WalkNavigateHelper.getInstance();
    //获取诱导页面地图展示View
            View view = mNaviHelper.onCreate(WNaviGuideActivity.this);
            if (view != null) {
                setContentView(view);
            }
    
            //获取语音播报文本
            //注意:该接口需要在startWikeNavi方法之前调用。
            mNaviHelper.setTTsPlayer(new IWTTSPlayer() {
                /**
                 * 诱导文本回调
                 * @param s 诱导文本
                 * @param b 是否抢先播报
                 * @return
                 */
                @Override
                public int playTTSText(String s, boolean b) {
                    return 0;
                }
            });
    
            mNaviHelper.startWalkNavi(WNaviGuideActivity.this);
    
            mNaviHelper.setWalkNaviStatusListener(new IWNaviStatusListener() {
                /**
                 * 普通步行导航模式和步行AR导航模式的切换
                 *
                 * @param
                 * @param walkNaviModeSwitchListener 步行导航模式切换的监听器
                 */
                @Override
                public void onWalkNaviModeChange(int mode, WalkNaviModeSwitchListener walkNaviModeSwitchListener) {
                    mNaviHelper.switchWalkNaviMode(WNaviGuideActivity.this, mode, walkNaviModeSwitchListener);
                }
    
                @Override
                public void onNaviExit() {
    
                }
            });
    
            mNaviHelper.setRouteGuidanceListener(this, new IWRouteGuidanceListener() {
                //诱导图标更新
                @Override
                public void onRouteGuideIconUpdate(Drawable drawable) {
    
                }
    
                //诱导类型枚举
                @Override
                public void onRouteGuideKind(RouteGuideKind routeGuideKind) {
    
                }
    
                /**
                 * 诱导信息
                 *
                 * @param charSequence  第一行显示的信息,如“沿当前道路”
                 * @param charSequence1 第二行显示的信息,比如“向东出发”,第二行信息也可能为空
                 */
                @Override
                public void onRoadGuideTextUpdate(CharSequence charSequence, CharSequence charSequence1) {
    
                }
    
                //总的剩余距离
                @Override
                public void onRemainDistanceUpdate(CharSequence charSequence) {
    
                }
    
                //总的剩余时间
                @Override
                public void onRemainTimeUpdate(CharSequence charSequence) {
    
                }
    
                //GPS状态发生变化,来自诱导引擎的消息
                @Override
                public void onGpsStatusChange(CharSequence charSequence, Drawable drawable) {
    
                }
    
                //已经开始偏航
                @Override
                public void onRouteFarAway(CharSequence charSequence, Drawable drawable) {
    
                }
    
                //偏航规划中
                @Override
                public void onRoutePlanYawing(CharSequence charSequence, Drawable drawable) {
    
                }
    
                //重新算路成功
                @Override
                public void onReRouteComplete() {
    
                }
    
                //抵达目的地
                @Override
                public void onArriveDest() {
    
                }
    
                //震动
                @Override
                public void onVibrate() {
    
                }
            });
        }
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == ArCameraView.WALK_AR_PERMISSION) {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    mNaviHelper.startCameraAndSetMapView(WNaviGuideActivity.this);
                } else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_DENIED) {
                    Toast.makeText(this, "需要开启相机使用权限", Toast.LENGTH_SHORT).show();
                }
            }
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            mNaviHelper.resume();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            mNaviHelper.pause();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            mNaviHelper.quit();
        }
    }
    

    相关文章

      网友评论

          本文标题:百度地图

          本文链接:https://www.haomeiwen.com/subject/tovupqtx.html