美文网首页
Android修真传之高德地图使用

Android修真传之高德地图使用

作者: 请不要动朕 | 来源:发表于2018-12-26 17:09 被阅读8次
    当前版本1.0.0

    本人是个未满一年经验的小新,正在进行Android修仙之路,由于没有师傅只能单兵作战,在修仙过程之中不断通过实战提高自己的修为。若对实战过程中有误的地方希望道友帮忙指正,不然本人将误入歧途最终成魔(哈哈)。在实战过程之前小辈会参考其他前辈的实战经验,这也是大多修真者都会这么做的,所以在实战过程中都不是原创。

    现在集成地图的APP无非是外卖,滴滴,物流,车载导航等一些需要获取当前目标位置目标信息。不过,目前开放的地图中有两个非常有实力的门派,分别是高德和百度,高德地图当我看见它的文档的时候我就注定使用它了,文档确实不过错还自带效果图。 文档

    准备资源

    创建应用

    老规矩还没高德账号的先去官网申请一下,注册登入完成之后右上角进入控制台。

    打开应用管理 右上角创建一个应用,创建完成之后添加key 添加key 填写信息
    key名称可以查看命令规范来写,然后就是你项目的包名,接下来就是需要获取SHA1,获取SHA1之后填入两个SHA1编辑框中即可。

    获取SHA1

    这里我就拷贝官网的图片。 打开控制台 切换目录 添加命令 拷贝SHA1

    下载SDK

    点我下载SDK,地图这里的话我选择3D地图,2D的话没那么真实体验感更不好。

    选择SDK

    导入SDK

    将下载好的SDK进行解压,切换project在main/java下创建jniLibs目录,将各平台的so包拷贝到此目录下,将jar包放入libs目录下。 导入SDK

    添加权限

    <!--用于进行网络定位-->
        <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"/>
        <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
        <!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
        <!--用于访问网络,网络定位需要上网-->
        <uses-permission android:name="android.permission.INTERNET"/>
        <!--用于读取手机当前的状态-->
        <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
        <!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <!--用于申请调用A-GPS模块-->
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
    

    添加key并引入服务

    <application>
       <meta-data android:name="com.amap.api.v2.apikey" android:value="您的key"></meta-data>
            <service android:name="com.amap.api.location.APSService"></service>
        </application>
    

    定位

    介绍

    移动互联时代,定位无处不在,任何一个应用只要想了解用户的位置,不管是为用户提供服务还是用于用户分析,就一定会用到定位。

    高德定位有多种方式,如下图。 定位方式

    高德定位需要使用到的对象有两个,分别是AMapLocationClient和AMapLocationClientOption。

    • AMapLocationClient:这个是定位服务类。提供单次定位、持续定位、位置相关功能。
    • AMapLocationClientOption:这个是定位参数设置,通过这个类可以对定位的相关参数进行设置,比如定位的时间间隔,定位模式等。

    编写流程

    1.初始化AMapLocationClient和AMapLocationClientOption

            //初始化AMapLocationClient
            mLocationClient = new AMapLocationClient(getApplicationContext());
            //初始化AMapLocationClientOption对象
            mLocationOption = new AMapLocationClientOption();
    

    2.根据自己的业务需求设置定位参数

            //设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
            mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
            //设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。
            mLocationOption.setInterval(1000*60);
            //设置定位参数
            mLocationClient.setLocationOption(mLocationOption);
    

    更多参数如下如图:

    返回值 方法名 解释
    boolean [isGpsFirst() 获取高精度模式下单次定位是否优先返回卫星定位信息
    boolean isKillProcess() 退出时是否杀死进程
    boolean isMockEnable() 是否允许模拟位置
    boolean isNeedAddress() 是否需要地址信息
    boolean isWifiScan() 是否允许主动调用WIFI刷新
    AMapLocationClientOption setGeoLanguage() 设置逆地理信息的语言,目前之中中文和英文
    AMapLocationClientOption setGpsFirst() 设置首次定位是否等待卫星定位结果
    AMapLocationClientOption setHttpTimeOut() 设置联网超时时间
    AMapLocationClientOption setLocationCacheEnable() 设置是否使用缓存策略
    AMapLocationClientOption setLocationPurpose() 设置定位场景
    AMapLocationClientOption setMockEnable() 设置是否允许模拟位置
    AMapLocationClientOption setOnceLocationLatest() 设置定位是否等待WIFI列表刷新 定位
    AMapLocationClientOption setSensorEnable() 是否使用设备传感器
    AMapLocationClientOption setWifiScan() 设置是否允许调用WIFI刷新

    3.监听位置的改变

           //设置定位回调监听
            mLocationClient.setLocationListener(mLocationListener);
           
           //声明定位回调监听器
        private AMapLocationListener mLocationListener = new AMapLocationListener() {
            @Override
            public void onLocationChanged(AMapLocation aMapLocation) {
                Log.d(TAG,"onLocationChanged " + aMapLocation.toStr());
                if (aMapLocation != null) {
                    if (aMapLocation.getErrorCode() == 0) {
                        //定位成功回调信息,设置相关消息
                        StringBuffer stringBuffer = new StringBuffer();
                        stringBuffer.append("国家:     " + aMapLocation.getCountry() +"\n");
                        stringBuffer.append("省:      " + aMapLocation.getProvince()+"\n");
                        stringBuffer.append("城市:     " + aMapLocation.getCity()+"\n");
                        stringBuffer.append("城区:     " + aMapLocation.getDistrict()+"\n");
                        stringBuffer.append("街道:     " + aMapLocation.getStreet()+"\n");
                        stringBuffer.append("街道门牌号:      " + aMapLocation.getStreetNum()+"\n");
                        stringBuffer.append("城市编码:       " + aMapLocation.getCityCode()+"\n");
                        stringBuffer.append("区域编码:       " + aMapLocation.getAdCode()+"\n");
                        stringBuffer.append("地址描述:       " + aMapLocation.getAddress()+"\n");
                        stringBuffer.append("定位类型:       " + aMapLocation.getLocationType()+"\n");
                        stringBuffer.append("获取纬度:       " + aMapLocation.getLatitude()+"\n");
                        stringBuffer.append("获取经度:       " + aMapLocation.getLongitude()+"\n");
                        stringBuffer.append("海拔:     " + aMapLocation.getAltitude()+"\n");
                        stringBuffer.append("速度:     " + aMapLocation.getSpeed()+"\n");
                        stringBuffer.append("方向角:        " + aMapLocation.getBearing()+"\n");
                        stringBuffer.append("室内定位建筑物Id:      " + aMapLocation.getBuildingId()+"\n");
                        stringBuffer.append("室内定位楼层:     " + aMapLocation.getFloor()+"\n");
                        stringBuffer.append("当前位置POI名称:      " + aMapLocation.getPoiName()+"\n");
                        stringBuffer.append("当前位置所处AOI名称:        " + aMapLocation.getAoiName()+"\n");
                        stringBuffer.append("设备当前 GPS 状态:        " + aMapLocation.getGpsAccuracyStatus()+"\n");
                        stringBuffer.append("定位来源:       " + aMapLocation.getLocationType()+"\n");
                        stringBuffer.append("定位信息描述:     " + aMapLocation.getLocationDetail()+"\n");
                        stringBuffer.append("获取精度信息:     " + aMapLocation.getAccuracy()+"\n");
                        stringBuffer.append("获取定位提供者:     " + aMapLocation.getProvider()+"\n");
                        stringBuffer.append("当前卫星数量:     " + aMapLocation.getSatellites()+"\n");
                        stringBuffer.append("定位结果的可信度 :     " + aMapLocation.getTrustedLevel()+"\n");
                        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        Date date = new Date(aMapLocation.getTime());
                        stringBuffer.append("定位时间:       " + df.format(date));
                        Log.d(TAG,stringBuffer.toString());
                        mTvContent.setText(stringBuffer.toString());
                        //具体
                    } else {
                        //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
                        Log.d(TAG, "location Error, ErrCode:"
                                + aMapLocation.getErrorCode() + ", errInfo:"
                                + aMapLocation.getErrorInfo());
                    }
                }
            }
        };
    

    4.开始定位

    mLocationClient.startLocation();
    

    5.onDestory()中释放资源

    @Override
        protected void onDestroy() {
            super.onDestroy();
            mLocationClient.stopLocation();
            mLocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务。
            mLocationClient = null;
        }
    

    测试结果,记得打开位置信息哦。


    测试结果

    地图

    高德开放平台提供2D,3D,卫星多种地图形式供开发者选择,无论基于哪种平台,都可以通过高德开放平台提供的API和SDK轻松的完成地图的构建工作。同时我们还提供强大的地图再开发能力,全面的地图数据支持,离线在线两种使用方式,多种地图交互模式,满足各个场景下对地图的需求。

    高德将地图已经封装成一个MapView,首先我们需要在xml中引入这个控件。

    <com.amap.api.maps.MapView
            android:id="@+id/amap_map_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />
    

    接下来在Activity生命周期中设置MapView的状态

    public class AMapActivity extends AppCompatActivity {
    
        private MapView mMapView;
        private AMap mAMap;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_amap);
    
            mMapView = findViewById(R.id.amap_map_view);
            //创建地图
            mMapView.onCreate(savedInstanceState);
            if (mAMap == null) {
                mAMap = mMapView.getMap();
            }
        }
        
        @Override
        protected void onDestroy() {
            super.onDestroy();
            //销毁地图
            mMapView.onDestroy();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            //重新绘制加载地图
            mMapView.onResume();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            //暂停地图的绘制
            mMapView.onPause();
        }
    
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            //保存地图当前的状态
            mMapView.onSaveInstanceState(outState);
        }
    }
    

    上面在onCrate中创建地图后再调用getMap()获取AMap对象,那么AMap对象是来干啥的?

    AMap 类是地图的控制器类,用来操作地图。它所承载的工作包括:地图图层切换(如卫星图、黑夜地图)、改变地图状态(地图旋转角度、俯仰角、中心点坐标和缩放级别)、添加点标记(Marker)、绘制几何图形(Polyline、Polygon、Circle)、各类事件监听(点击、手势等)等,AMap 是地图 SDK 最重要的核心类,诸多操作都依赖它完成。

    下面看看运行效果 运行效果

    咦!地图怎么显示的是北京的啊而且还没有那个自身位置标识的蓝点,很明显不对,别急,我们还需要进行定位,因为MapView默认加载的是位置是北京。

    导航

    路线规划

    搜索

    鹰眼

    相关文章

      网友评论

          本文标题:Android修真传之高德地图使用

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