基于百度地图SDK定位服务的项目实现(一)

上学的时候,学习Android,当时正赶上参加各种比赛的热潮,互联网+…挑战杯…思来想去,决定不如在安卓中嵌入一个地图,实现定位功能,一来可以摆脱学校中所学的基础,可以提高一点项目的*格。然后在高德和百度两家地图做选择,最终,选择了本人平时常用的百度地图…好了,废话不多说了,开始为项目添加百度地图吧!!

第一步

百度地图开发者平台 点击进入

在开发文档中找到Android开发
在开发文档中找到,Android开发,这里有很多选项,里面的内容,怎么说呢,我是看的挺懵的,所以按照项目需求来,选择第一项 Android地图SDK

点击获取密匙

在这里插入图片描述

创建应用

在这里插入图片描述

填写名称、应用类型选择Android SDK

启动服务这块 其实都勾选上也无所谓

在这里插入图片描述

注意了 这里需要 添加发布版的SHA1 和项目包名

项目包名简单 发布版的SHA1获取方式如下

首先找到 c盘 用户里 .android文件 然后cd到这个文件中,执行命令:

keytool -list -v -keystore debug.keystore

然后会提示 输入密匙库口令:

输入 android 即可

在这里插入图片描述
拿到密匙后 回到界面 创建项目。

这里可能会出现keytool 不是内部或外部命令,解决办法如下
进入到jdk安装目录的bin目录下,再输入以下命令即可获得SHA1

传送门:keytool解决办法

继续进行

拿到 SHA1 和 填入包名后
在这里插入图片描述
会有如上的(AK) ,这个就是我们项目需要的东西了

新建Android工程

然后在AndroidManifest.xml里添加
在这里插入图片描述
value就是你的 (AK)

然后继续返回到开发者平台

这次我们将需要的相关工具下载下来

JAR下载
在这里插入图片描述
选择需要的功能,后续会出导航类项目~

然后将下载好的工具包放入到Android工程中,具体位置如下
将liblocSDK4.so文件拷贝到libs/armeabi目录下。
将locSDK4.0.jar文件拷贝到工程的libs目录下

然后在安卓的build.gradle里添加相关依赖

implementation files(‘libs/BaiduLBS_Android.jar’)

加载一下…

然后在layout里新建 activity_map.xml

或者直接创建新的Activity
在这里插入图片描述

在activity_map.xml中添加如下代码

在这里插入图片描述因为我是在Framgent中嵌入百度地图

public class TabMapFragment extends Fragment implements OnGetGeoCoderResultListener   {
    private static final String TAG="app_safety_Fragment";
    private MapView mapView=null;
    private BaiduMap baiduMap;
    // 定位相关
    private LocationClient locationClient;
    boolean isFirstLoc = true;// 是否首次定位
    LocationClientOption option = null;
    GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用



    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,
                             Bundle savedInstanceState) {
        SDKInitializer.initialize(getActivity().getApplicationContext());

        View view = inflater.inflate(R.layout.activity_map, container, false);
        btn =view.findViewById(R.id.btn);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((MenuActivity)getActivity()).setSpinnerAdapter();
            }
        });


        mapView = (MapView) view.findViewById(R.id.bmapView);
        baiduMap = mapView.getMap();
        mSearch = GeoCoder.newInstance();
        mSearch.setOnGetGeoCodeResultListener(this);
        // 开启定位图层
        baiduMap.setMyLocationEnabled(true);
        // 定位初始化
        locationClient = new LocationClient(getActivity().getApplicationContext());
        locationClient.registerLocationListener(new MyLocationListener());//将原代码中public class MyLocationListener implements BDLocationListener改为 public class MyLocationListener extends BDAbstractLocationListener
        option = new LocationClientOption();
        Log.i(TAG, "==-->option:="+option);
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//设置定位模式:高精度,低功耗,仅设备
        option.setOpenGps(true);// 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000);//设置每秒更新一次位置信息
        // option.disableCache(false);// 禁止启用缓存定位
        option.setIsNeedLocationDescribe(true);//设置需要位置描述信息
        option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
        option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
        option.setIgnoreKillProcess(true);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死
        option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
        option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
        option.setNeedDeviceDirect(true);//可选,设置是否需要设备方向结果
        option.setOpenAutoNotifyMode(); //设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者,该模式下开发者无需再关心定位间隔是多少,定位SDK本身发现位置变化就会及时回调给开发者
        locationClient.setLocOption(option);
        locationClient.start();

        return view;

    }
    /**
     * 定位SDK监听函数
     */
    public class MyLocationListener extends BDAbstractLocationListener {


        @Override
        public void onReceiveLocation(BDLocation location) {
            // map view 销毁后不在处理新接收的位置
            if (location == null || mapView == null)
                return;
            //                        // 反Geo搜索
            mSearch.reverseGeoCode(new ReverseGeoCodeOption()
                    .location(baiduMap.getMapStatus().target));
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(location.getDirection()).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            baiduMap.setMyLocationData(locData);
            LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
            // 设置地图中心点
            MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory
                    .newMapStatus(new MapStatus.Builder().target(latLng)
                            .overlook(-15).rotate(180).zoom(17).build());
            baiduMap.setMapStatus(mapStatusUpdate);
            if (isFirstLoc) {
                LatLng ll = new LatLng(location.getLatitude(),
                        location.getLongitude());
                MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
                baiduMap.animateMapStatus(u);
                if (baiduMap.getLocationData() != null)
                    if (baiduMap.getLocationData().latitude == location.getLatitude()
                            && baiduMap.getLocationData().longitude == location.getLongitude()) {
                        isFirstLoc = false;
                    }
            }
        }

    }
    @Override
    public void onGetGeoCodeResult(GeoCodeResult result) {

    }
    @Override
    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {

    }

运行效果图:
2020年起,添加了相机功能 后续功能还在开发中
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值