美文网首页Android开源库
高德地图-定位SDK使用

高德地图-定位SDK使用

作者: cy_why | 来源:发表于2015-12-16 10:27 被阅读14166次

    在高德地图定位SDK的使用过程中,记录下些细节处理。方便以后整理。
    此文是整理在能够显示高德地图的前提下的。

    1. 配置AndroidManifest文件

    application标签中声明service组件,每个app拥有自己单独的定位service。

    <service android:name="com.amap.api.location.APSService"></service>
    

    2. 启动定位服务

    2.1 初始化定位客户端,设置监听

        //定位服务类。此类提供单次定位、持续定位、地理围栏、最后位置相关功能
        private AMapLocationClient aMapLocationClient;
        //声明定位回调监听器
        private OnLocationChangedListener listener;
        //初始化定位
        aMapLocationClient = new AMapLocationClient(getApplicationContext());
        //设置定位回调监听
        aMapLocationClient.setLocationListener(this);
    

    2.2 配置定位参数,启动定位

            //定位参数设置
            private AMapLocationClientOption aMapLocationClientOption;
            //初始化定位参数
            aMapLocationClientOption = new AMapLocationClientOption();
            //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
            aMapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
            //设置是否返回地址信息(默认返回地址信息)
            aMapLocationClientOption.setNeedAddress(true);
            //设置是否只定位一次,默认为false
            aMapLocationClientOption.setOnceLocation(false);
            //设置是否强制刷新WIFI,默认为强制刷新
            aMapLocationClientOption.setWifiActiveScan(true);
            //设置是否允许模拟位置,默认为false,不允许模拟位置
            aMapLocationClientOption.setMockEnable(false);
            //设置定位间隔,单位毫秒,默认为2000ms
            aMapLocationClientOption.setInterval(2000);
            //给定位客户端对象设置定位参数
            aMapLocationClient.setLocationOption(aMapLocationClientOption);
            //启动定位
            aMapLocationClient.startLocation();
    

    3. 添加定位接口

    定位接口

    4. 添加监听

    // 设置定位监听
    aMap.setLocationSource(this);
    //设置默认定位按钮是否显示
    aMap.getUiSettings().setMyLocationButtonEnabled(true);
    // 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
    aMap.setMyLocationEnabled(true);
    // 设置定位的类型为定位模式,参见类AMap。
    aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);
    // 设置为true表示系统定位按钮显示并响应点击,false表示隐藏,默认是false
    aMap.setMyLocationEnabled(true);
    

    其中locationSource接口是一个提供位置数据的接口。实现该接口需复写其中的方法activate,该方法的具体解释如下:

    activate方法解释

    在此方法中激活定位回调监听器listener。否则接收不到定位。

        @Override
        public void activate(OnLocationChangedListener onLocationChangedListener) {
            listener = onLocationChangedListener;
        }
    

    5. 获取定位结果

    复写定位回调接口AMapLocationListener中的方法,获取定位后的结果。

         /**
         * 定位回调监听,当定位完成后调用此方法
         * @param aMapLocation
         */
        @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
            if(listener!=null && aMapLocation!=null) {
                listener.onLocationChanged(aMapLocation);// 显示系统小蓝点
                if (aMapLocation.getErrorCode() == 0) {
                    //定位成功回调信息,设置相关消息
                    aMapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
                    aMapLocation.getLatitude();//获取经度
                    aMapLocation.getLongitude();//获取纬度;
                    aMapLocation.getAccuracy();//获取精度信息
                    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Date date = new Date(aMapLocation.getTime());
                    df.format(date);//定位时间
                    aMapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果
                    aMapLocation.getCountry();//国家信息
                    aMapLocation.getProvince();//省信息
                    aMapLocation.getCity();//城市信息
                    aMapLocation.getDistrict();//城区信息
                    aMapLocation.getRoad();//街道信息
                    aMapLocation.getCityCode();//城市编码
                    aMapLocation.getAdCode();//地区编码
                } else {
                    //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
                    Log.e("Tomato","location Error, ErrCode:"
                            + aMapLocation.getErrorCode() + ", errInfo:"
                            + aMapLocation.getErrorInfo());
                }
            }
        }
    

    其中错误码为0的情况定位正常。

    6. 停止定位

        @Override
        protected void onDestroy() {
            super.onDestroy();
            mapView.onDestroy();
            //销毁定位客户端
            if(aMapLocationClient!=null){
                aMapLocationClient.onDestroy();
                aMapLocationClient = null;
                aMapLocationClientOption = null;
            }
        }
    

    7. 源代码

    package com.tomato.lbsdemo;
    
    import android.graphics.Color;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.widget.CompoundButton;
    import com.amap.api.location.AMapLocation;
    import com.amap.api.location.AMapLocationClient;
    import com.amap.api.location.AMapLocationClientOption;
    import com.amap.api.location.AMapLocationListener;
    import com.amap.api.maps.AMap;
    import com.amap.api.maps.LocationSource;
    import com.amap.api.maps.MapView;
    import com.amap.api.maps.model.BitmapDescriptorFactory;
    import com.amap.api.maps.model.MyLocationStyle;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener
            ,AMapLocationListener,LocationSource {
        private MapView mapView;
        private AMap aMap;
        //定位服务类。此类提供单次定位、持续定位、地理围栏、最后位置相关功能
        private AMapLocationClient aMapLocationClient;
        private OnLocationChangedListener listener;
        //定位参数设置
        private AMapLocationClientOption aMapLocationClientOption;
    
        @Override
        protected void onCreate (Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            mapView = (MapView)findViewById(R.id.map);
            mapView.onCreate(savedInstanceState);  //必须写
            aMap = mapView.getMap();
            //设置地图类型
            aMap.setMapType(AMap.MAP_TYPE_NORMAL);
    
            MyLocationStyle locationStyle = new MyLocationStyle();
            locationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.drawable.start));
            locationStyle.strokeColor(Color.BLUE);
            locationStyle.strokeWidth(5);
            aMap.setMyLocationStyle(locationStyle);
    
            // 设置定位监听
            aMap.setLocationSource(this);
            aMap.getUiSettings().setMyLocationButtonEnabled(true);//设置默认定位按钮是否显示
            aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
            // 设置定位的类型为定位模式,参见类AMap。
            aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);
            // 设置为true表示系统定位按钮显示并响应点击,false表示隐藏,默认是false
            aMap.setMyLocationEnabled(true);
    
            aMapLocationClient = new AMapLocationClient(getApplicationContext());
            aMapLocationClient.setLocationListener(this);
    
            //初始化定位参数
            aMapLocationClientOption = new AMapLocationClientOption();
            //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
            aMapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
            //设置是否返回地址信息(默认返回地址信息)
            aMapLocationClientOption.setNeedAddress(true);
            //设置是否只定位一次,默认为false
            aMapLocationClientOption.setOnceLocation(false);
            //设置是否强制刷新WIFI,默认为强制刷新
            aMapLocationClientOption.setWifiActiveScan(true);
            //设置是否允许模拟位置,默认为false,不允许模拟位置
            aMapLocationClientOption.setMockEnable(false);
            //设置定位间隔,单位毫秒,默认为2000ms
            aMapLocationClientOption.setInterval(2000);
            //给定位客户端对象设置定位参数
            aMapLocationClient.setLocationOption(aMapLocationClientOption);
            //启动定位
            aMapLocationClient.startLocation();
        }
    
        /**
         * 定位回调监听,当定位完成后调用此方法
         * @param aMapLocation
         */
        @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
            if(listener!=null && aMapLocation!=null) {
                listener.onLocationChanged(aMapLocation);// 显示系统小蓝点
                if (aMapLocation.getErrorCode() == 0) {
                    //定位成功回调信息,设置相关消息
                    aMapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
                    aMapLocation.getLatitude();//获取经度
                    aMapLocation.getLongitude();//获取纬度;
                    aMapLocation.getAccuracy();//获取精度信息
                    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Date date = new Date(aMapLocation.getTime());
                    df.format(date);//定位时间
                    aMapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果
                    aMapLocation.getCountry();//国家信息
                    aMapLocation.getProvince();//省信息
                    aMapLocation.getCity();//城市信息
                    aMapLocation.getDistrict();//城区信息
                    aMapLocation.getRoad();//街道信息
                    aMapLocation.getCityCode();//城市编码
                    aMapLocation.getAdCode();//地区编码
                } else {
                    //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
                    Log.e("Tomato","location Error, ErrCode:"
                            + aMapLocation.getErrorCode() + ", errInfo:"
                            + aMapLocation.getErrorInfo());
                }
            }
        }
    
    
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        }
    
        @Override
        public void activate(OnLocationChangedListener onLocationChangedListener) {
            listener = onLocationChangedListener;
        }
    
        @Override
        public void deactivate() {
    
        }
    
        /**
         * 方法必须重写
         */
        @Override
        protected void onResume() {
            super.onResume();
            mapView.onResume();
        }
    
        /**
         * 方法必须重写
         */
        @Override
        protected void onPause() {
            super.onPause();
            mapView.onPause();
        }
    
        /**
         * 方法必须重写
         */
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            mapView.onSaveInstanceState(outState);
        }
    
        /**
         * 方法必须重写
         */
        @Override
        protected void onDestroy() {
            super.onDestroy();
            mapView.onDestroy();
            //销毁定位客户端
            if(aMapLocationClient!=null){
                aMapLocationClient.onDestroy();
                aMapLocationClient = null;
                aMapLocationClientOption = null;
            }
        }
    }
    
    

    AndroidMainfest.xml配置

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.tomato.lbsdemo" >
    
        <!--地图包、搜索包需要的基础权限-->
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"  />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"  />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    
        <permission android:name="android.permission.WRITE_APN_SETTINGS" />
        <!--定位包、导航包需要的额外权限(注:基础权限也需要)-->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
        <!--<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />-->
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    
        <uses-sdk
            android:minSdkVersion="15"
            android:targetSdkVersion="23" />
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
    
            <meta-data
                android:name="com.amap.api.v2.apikey"
                android:value="LBS上申请的Key">
            </meta-data>
            <service android:name="com.amap.api.location.APSService"></service>
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name"
                android:theme="@style/AppTheme.NoActionBar" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    8. 自定义定位图标

    使用定位(当前位置)的绘制样式类MyLocationStyle,对定位图标进行自定义。

    MyLocationStyle locationStyle = new MyLocationStyle();
    locationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.drawable.start));
    locationStyle.strokeColor(Color.BLUE);
    locationStyle.strokeWidth(5);
    aMap.setMyLocationStyle(locationStyle);
    

    相关文章

      网友评论

      • 小鸟龟吃螃蟹:。。跟官方提供的别无二致。。。
      • 2d144f58226b:mark,刚一部手机死活得不到定位数据,看看高德行不行。
      • yaoTongxue:不错,,看了你大部分文章,加油吧。
      • 76423d6c6eaf:楼主,能否问一下, 按你的写法, 在第一次 进入应用的时候 定位成功, 但是 在不关闭程序的情况下 第二次 进去 便不能定位 这种情况 要怎么解决呢
        cy_why:aMapLocationClientOption.setOnceLocation(false);这句话设置了只定位一次呢
      • 逍遥呀:不错
      • 追风骚年: aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE); 这个方法现在没有了怎么搞啊

      本文标题:高德地图-定位SDK使用

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