移动技术开发(四)-使用百度地图API实现实时定位

一、任务需求

阅读百度地图开发者文档,进行基于百度地图的简单应用开发。
需要实现的基本功能:实时定位,在地图上标记出使用者所在的位置。

二、安卓基于位置的服务(Location Based Service, LBS)

  1. LBS定义
    位置服务(Location Based Services,LBS)又称定位服务,是指通过GPS卫星或者网络(WiFi或GPRS)获取各种终端的地理坐标(经度和纬度),在电子地图平台的支撑下,为用户提供基于位置导航、查询的一种信息服务。
    目前,使用LBS服务的应用涉及到了我们生活的方方面面,诸如美团、饿了么、各类地图app,各类运动app以及最近的战疫健康打卡等,学会使用LBS还是有很大帮助的。

  2. 三种常见的定位模式
    目前,常见的三种定位模式为:

  • GPS定位
  • Wi-Fi定位
  • 基站定位

三、使用百度地图API进行简单定位

1. 获取SDK

  1. 申请开发者账户
  2. 创建应用
    申请应用
  • 输入命令行和密码,获取SHA1等信息:
    命令行:keytool -list -v -keystore debug.keystore;
    密码:原始密码一般为android,开发者根据实际情况填写。
申请应用

AK

2. 配置百度地图API

1. 下载所需对应功能的jar包资源。
2. 将下载的压缩包文件解压至app目录下的lib文件夹中。
3. 在app目录下的build.gradle文件中android块中配置sourceSets标签,如果没有使用该标签则新增,详细配置代码如下:
sourceSets {
           main {
               jniLibs.srcDir 'libs'
           }
}
4. 在AndroidManifest.xml文件中进行相关配置:

在application标签下添加如下代码:

<meta-data
    android:name="com.baidu.lbsapi.API_KEY"
    android:value="你申请到的AK"/>
<service android:name="com.baidu.location.f"
    android:enabled="true"
    android:process=":remote"/>

声明权限

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

3. 编码阶段

这里其实百度地图的Android定位开发文档有着较好的说明示例,主要参照开发文档即可实现简单的定位功能了。
这里展示部分代码如下:

 private void requestLocation() {
        MyLocationListener myLocationListener = new MyLocationListener();
        mLocationClient = new LocationClient(getApplicationContext());
        mLocationClient.registerLocationListener(myLocationListener);
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);

        mapView = findViewById(R.id.bmapView);
        baiduMap = mapView.getMap();
        baiduMap.setMyLocationEnabled(true);
        txtPosition = findViewById(R.id.txtPosition);

        LocationClientOption option = new LocationClientOption();
        option.setScanSpan(1000);//每一秒发送一次
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        option.setIsNeedAddress(true);
        mLocationClient.setLocOption(option);
        mLocationClient.start();//启动位置请求
    }


    private class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
            StringBuffer currentPosition = new StringBuffer();
            currentPosition.append("Longitude: ").append(bdLocation.getLongitude()).append("\n");
            currentPosition.append("Latitude: ").append(bdLocation.getLatitude());
            String s = "" + bdLocation.getLatitude();
            txtPosition.setText(currentPosition);

            if (bdLocation.getLocType() == BDLocation.TypeGpsLocation || bdLocation.getLocType() == BDLocation.TypeNetWorkLocation) {
                setMyLocation(bdLocation);
            }

        }
    }

    private void setMyLocation(BDLocation bdLocation) {
        if (isFirstLocation) {
            LatLng latLng = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
            MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(latLng);
            MyLocationData locationData = new MyLocationData.Builder().latitude(latLng.latitude).longitude(latLng.longitude).build();
            baiduMap.animateMapStatus(update);
            baiduMap.setMyLocationData(locationData);       // 地图上显示定位点
            isFirstLocation = false;
        }
    }

四、实现效果

  • 这里需要说明,我在模拟器上运行无法获取实际地理坐标(之后用安卓设备进行调试,定位成功)。


    运行效果

五、源码地址

https://gitee.com/morenmoren/android-app_-tab/tree/master/BaiduMapLocation

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容