安卓高德地图-(定位+离线UI组件自定义1)

效果图:

这里写图片描述

其中第二张图是官网默认的,后面有讲解如何自己定义界面。

STEP1:

先去高德开放平台注册账号,网址:http://lbs.amap.com/
之后再去控制台-应用管理找到自己的key,如下图所示

这里写图片描述

STEP2:集成前的准备

1、引入依赖, 项目build.gradle中加入:
//定位
compile ‘com.amap.api:location:latest.integration’
//地图
compile ‘com.amap.api:3dmap:latest.integration’

2、资源下载网址:http://lbs.amap.com/api/android-sdk/download

解压后将相应jar架包放入项目libs目录下(注意jar右键Add As Librarys ),同时新建jinLibs将so库放入(注意新建文件夹与java平级,也可一并放入libs目录下),官网的jar完整包名AMap3DMap_5.7.0_AMapNavi_5.6.0_20180109 -官网完整包名(改名方法:右键Refactor-Rename 文件类名更改也如此 )

这里写图片描述

STEP3:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.helloworld.mapdemo">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!--高德自带离线UI界面-->
        <activity
            android:name="com.amap.api.maps.offlinemap.OfflineMapActivity"
            android:screenOrientation="portrait" />

        <!-- 高德地图 -->
        <meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="a6ed68efeb86d67491a065309cc4f4d6" /><!--换上你自己的App Key-->

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

        <!--自定义离线UI界面-->
        <activity android:name=".OfflineMapMyActivity"/>
    </application>

</manifest>

STEP4: LocationUtils 相关基本配置

package com.helloworld.mapdemo;

import android.content.Context;

import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;

public class LocationUtils {

    /**
     * 初始化定位
     */
    public static AMapLocationClient initLocation(Context context, AMapLocationClientOption locationOption, AMapLocationListener locationListener) {
        //初始化client
        AMapLocationClient locationClient = new AMapLocationClient(context.getApplicationContext());
        //设置定位参数
        locationClient.setLocationOption(locationOption);
        // 设置定位监听
        locationClient.setLocationListener(locationListener);
        return locationClient;
    }

    /**
     * 定位参数
     */
    public static AMapLocationClientOption getDefaultOption() {
        AMapLocationClientOption mOption = new AMapLocationClientOption();
        //可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
        mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        //可选,设置是否gps优先,只在高精度模式下有效。默认关闭
        mOption.setGpsFirst(false);
        //可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
        mOption.setHttpTimeOut(25000);
        //可选,设置定位间隔。默认为2秒
        mOption.setInterval(2000);
        //可选,设置是否返回逆地理地址信息。默认是true
        mOption.setNeedAddress(true);
        //可选,设置是否单次定位。默认是false
        mOption.setOnceLocation(false);
        //可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用
        mOption.setOnceLocationLatest(false);
        //可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
        AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);
        //可选,设置是否使用传感器。默认是false
        mOption.setSensorEnable(false);
        //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,
        //停止以后完全依赖于系统刷新,定位位置可能存在误差
        mOption.setWifiScan(true);
        //可选,设置是否使用缓存定位,默认为true
        mOption.setLocationCacheEnable(true);
        return mOption;
    }
}

STEP 5:权限类

package com.helloworld.mapdemo;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;

import java.util.ArrayList;
import java.util.List;

/**
 * 高德定位相关权限类
 */

public class PermissionsUtils {

    /**
     * 需要进行检测的定位权限数组
     */
    public static String[] locationPermissions = {
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.READ_PHONE_STATE
    };

    private PermissionsUtils() {
    }

    public static boolean checkPermissions(Activity activity, int requestcode, String... permissions) {
        List<String> needRequestPermissonList = findDeniedPermissions(permissions, activity);
        if (null != needRequestPermissonList && needRequestPermissonList.size() > 0) {
            ActivityCompat.requestPermissions(activity, needRequestPermissonList.toArray(
                    new String[needRequestPermissonList.size()]), requestcode);
            return false;
        } else {
            return true;
        }
    }

    private static List<String> findDeniedPermissions(String[] permissions, Activity activity) {
        List<String> needRequestPermissonList = new ArrayList<>();
        for (String perm : permissions) {
            if (ContextCompat.checkSelfPermission(activity,
                    perm) != PackageManager.PERMISSION_GRANTED
                    || ActivityCompat.shouldShowRequestPermissionRationale(
                    activity, perm)) {
                needRequestPermissonList.add(perm);
            }
        }
        return needRequestPermissonList;
    }

    public static boolean verifyPermissions(int[] grantResults) {
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }
}

STEP:6 MainActivity :

http://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation (参数返回文档地址)

package com.helloworld.mapdemo;

import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

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.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.MyLocationStyle;
import com.amap.api.maps.offlinemap.OfflineMapActivity;

public class MainActivity extends AppCompatActivity implements AMapLocationListener, View.OnClickListener {

    private static final int PERMISSON_REQUESTCODE = 0;
    private MapView mMapView;
    private AMap aMap;
    //判断权限是否打开
    private boolean isNeedCheck = true;
    private static final String TAG = "MapLocationActivity";
    //声明AMapLocationClient类对象
    public AMapLocationClient mLocationClient = null;
    //声明AMapLocationClientOption对象
    public AMapLocationClientOption mLocationOption = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.map_one).setOnClickListener(this);
        findViewById(R.id.map_two).setOnClickListener(this);
        findViewById(R.id.map_three).setOnClickListener(this);
        findViewById(R.id.map_four).setOnClickListener(this);
        findViewById(R.id.map_five).setOnClickListener(this);

        mMapView = (MapView) this.findViewById(R.id.map);
        // 此方法须重写,虚拟机需要在很多情况下保存地图绘制的当前状态
        mMapView.onCreate(savedInstanceState);
        initLocation();
    }

    private void initLocation() {
        if (aMap == null) {
            aMap = mMapView.getMap();
        }
        //缩放级别3 -19,不支持自定义 要监听否则无效
        aMap.setOnMapLoadedListener(new AMap.OnMapLoadedListener() {
            @Override
            public void onMapLoaded() {
                aMap.moveCamera(CameraUpdateFactory.zoomTo(15));
            }
        });
        //指南针
        aMap.getUiSettings().setCompassEnabled(true);
        //显示默认的定位按钮
        aMap.getUiSettings().setMyLocationButtonEnabled(true);
        //显示实时交通状况
        //aMap.setTrafficEnabled(true);
        //地图模式:导航地图:MAP_TYPE_NAVI、夜景地图:MAP_TYPE_NIGHT、
        //白昼地图(即普通地图):MAP_TYPE_NORMAL、卫星地图:MAP_TYPE_SATELLITE
        //aMap.setMapType(AMap.MAP_TYPE_NORMAL);
        //缩放级别≥17级时,地图上可以显示室内地图。(true:显示室内地图;false:不显示)
        //缩放级别≥18级时,不仅可以看到室内地图效果,还允许操作切换楼层,显示精细化室内地图
        aMap.showIndoorMap(true);
        initLocationStyle();
        //动态设置权限
        if (isNeedCheck) {
            if (PermissionsUtils.checkPermissions(this, PERMISSON_REQUESTCODE, PermissionsUtils.locationPermissions)) {
                initaion();
            }
        } else {
            initaion();
        }
    }

    private void initaion() {
        //基本的定位参数
        mLocationOption = LocationUtils.getDefaultOption();
        mLocationClient = LocationUtils.initLocation(this, mLocationOption, this);
        //启动定位
        mLocationClient.startLocation();
    }

    private void initLocationStyle() {
        //实现定位蓝点
        //初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);
        //如果不设置myLocationType,默认也会执行此种模式。
        MyLocationStyle myLocationStyle = new MyLocationStyle();
        //设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
        aMap.setMyLocationEnabled(true);
        //自定义小蓝点的图标(不设置则使用默认蓝点图标)
        myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher));
        //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。
        //单位:毫秒,默认值:1000毫秒,如果传小于1000的任何值将按照1000计算。
        myLocationStyle.interval(2000);
        //只定位一次。
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW);
        //定位一次,且将视角移动到地图中心点。
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);
        //连续定位、且将视角移动到地图中心点,定位蓝点跟随设备移动。(1秒1次定位)
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW) ;
        //连续定位、且将视角移动到地图中心点,地图依照设备方向旋转,定位点会跟随设备移动。(1秒1次定位)
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE);
        //连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)默认执行此种模式。
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);

        //以下三种模式从5.1.0版本开始提供
        //连续定位、蓝点不会移动到地图中心点,定位点依照设备方向旋转,并且蓝点会跟随设备移动。
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);
        //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER);
        //连续定位、蓝点不会移动到地图中心点,地图依照设备方向旋转,并且蓝点会跟随设备移动。
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE_NO_CENTER);
        //设置定位蓝点的icon图标方法,需要用到BitmapDescriptor类对象作为参数。
        //myLocationStyle.myLocationIcon(R.mipmap.ic_launcher);
        //设置是否显示定位小蓝点,用于满足只想使用定位,不想使用定位小蓝点的场景,设置false以后图面上不再有定位蓝点的概念,但是会持续回调位置信息。
        //myLocationStyle.showMyLocation(true);
        //设置定位蓝点精度圆圈的边框颜色的方法。(注意不要使用R.color)
        myLocationStyle.strokeColor(Color.parseColor("#FF0000"));//红色
        //设置定位蓝点精度圆圈的填充颜色的方法。
        myLocationStyle.radiusFillColor(Color.parseColor("#55000000"));//半透明
        //设置定位蓝点精度圈的边框宽度的方法。
        myLocationStyle.strokeWidth(10f);
        //设置定位蓝点的Style
        aMap.setMyLocationStyle(myLocationStyle);
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == PERMISSON_REQUESTCODE) {
            if (!PermissionsUtils.verifyPermissions(grantResults)) {
                //没打开权限 跳转至设置界面
                Tools.startAppSettings(this);
                isNeedCheck = false;
            } else {
                initLocation();
            }
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //销毁地图
        if (mMapView != null) {
            mMapView.onDestroy();
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        //重新绘制加载地图
        if (mMapView != null) {
            mMapView.onResume();
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        //暂停地图的绘制
        if (mMapView != null) {
            mMapView.onPause();
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if (mMapView != null) {
            mMapView.onSaveInstanceState(outState);
        }
    }

    private String cityName, AdCode, cityCode, province, poiName, street, district;
    private double latitude, longitude;

    @Override
    public void onLocationChanged(AMapLocation amapLocation) {
        if (amapLocation.getErrorCode() == 0) {
            //更多返回看(文档:http://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation)
            latitude = amapLocation.getLatitude();//获取纬度
            longitude = amapLocation.getLongitude();//获取经度
            province = amapLocation.getProvince();//省信息
            cityName = amapLocation.getCity();//城市信息
            district = amapLocation.getDistrict();//城区信息
            street = amapLocation.getStreet();//街道信息
            cityCode = amapLocation.getCityCode();//城市编码
            AdCode = amapLocation.getAdCode();//地区编码
            poiName = amapLocation.getPoiName();//获取当前位置的POI名称
            Log.e(TAG, "onLocationChanged: " + cityName);
            Log.e(TAG, "onLocationChanged: " + AdCode);
            Log.e(TAG, "onLocationChanged: " + cityCode);
            Log.e(TAG, "onLocationChanged: " + province);
            Log.e(TAG, "onLocationChanged: " + poiName);
            Log.e(TAG, "onLocationChanged: " + latitude);
            Log.e(TAG, "onLocationChanged: " + street);
            Log.e(TAG, "onLocationChanged: " + longitude);
            Log.e(TAG, "onLocationChanged: " + district);
            Log.e(TAG, "onLocationChanged: " + amapLocation.getAddress());
            Log.e(TAG, "onLocationChanged: " + amapLocation.getStreetNum());
            Log.e(TAG, "onLocationChanged: " + amapLocation.getLocationType());
            Log.e(TAG, "onLocationChanged: " + amapLocation.getLocationDetail());
            //停止定位后,本地定位服务并不会被销毁
            mLocationClient.stopLocation();
            //销毁定位客户端,同时销毁本地定位服务。
            mLocationClient.onDestroy();
        } else {
            //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
            Log.e(TAG, "定位失败, 错误码:"
                    + amapLocation.getErrorCode() + "\n"
                    + " 错误信息:"
                    + amapLocation.getErrorInfo() + "\n"
                    + "APK SHA1值为:" + Tools.getSHA1(this));
            String str = amapLocation.getErrorInfo();
            String[] split = str.split(" ");
            //截取第一个空格之前的错误日志
            Toast.makeText(this, split[0], Toast.LENGTH_SHORT).show();
            //停止定位后,本地定位服务并不会被销毁
            mLocationClient.stopLocation();
            //销毁定位客户端,同时销毁本地定位服务。
            mLocationClient.onDestroy();
        }
    }

    //地图模式:导航地图:MAP_TYPE_NAVI、夜景地图:MAP_TYPE_NIGHT、
    //白昼地图(即普通地图):MAP_TYPE_NORMAL、卫星地图:MAP_TYPE_SATELLITE
    //aMap.setMapType(AMap.MAP_TYPE_NORMAL)----(默认普通地图)
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.map_one:
                aMap.setMapType(AMap.MAP_TYPE_NAVI);
                break;
            case R.id.map_two:
                aMap.setMapType(AMap.MAP_TYPE_NIGHT);
                break;
            case R.id.map_three:
                aMap.setMapType(AMap.MAP_TYPE_NORMAL);
                break;
            case R.id.map_four:
                aMap.setMapType(AMap.MAP_TYPE_SATELLITE);
                break;
            case R.id.map_five:
                //高德自带离线地图UI组件
                startActivity(new Intent(this, OfflineMapActivity.class));
                //自定义离线地图UI组件             
                //startActivity(new Intent(this, OfflineMapMyActivity.class));
                break;
        }
    }
}

布局文件: activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.helloworld.mapdemo.MainActivity">

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <Button
            android:id="@+id/map_one"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="导航地图" />

        <Button
            android:id="@+id/map_two"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="夜景地图" />

        <Button
            android:id="@+id/map_three"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="普通地图" />

        <Button
            android:id="@+id/map_four"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="卫星图" />

        <Button
            android:id="@+id/map_five"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="离线地图组件" />

    </LinearLayout>
</RelativeLayout>

获取APK当前调试版的SHA1:

这里写图片描述

正式版的:
找到studio的Terminal 控制台 输入keytool -list -v -keystore debug.keystore 回车(其中debug.keystore换成jks签名文件路径)
例如:keytool -list -v -keystore D:\ASWorkspace\HelloWord.jks

STEP7: Tools 工具类

package com.helloworld.mapdemo;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.Settings;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Locale;

public class Tools {

    /**
     * 跳转至设置界面方法
     */
    public static void startAppSettings(Context context) {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.parse("package:" + context.getPackageName()));
        context.startActivity(intent);
    }

    /**
     * 获取APK当前签名文件的SHA1
     */
    public static String getSHA1(Context context) {
        try {
            PackageInfo info = context.getPackageManager().getPackageInfo(
                    context.getPackageName(), PackageManager.GET_SIGNATURES);
            byte[] cert = info.signatures[0].toByteArray();
            MessageDigest md = MessageDigest.getInstance("SHA1");
            byte[] publicKey = md.digest(cert);
            StringBuffer hexString = new StringBuffer();
            for (int i = 0; i < publicKey.length; i++) {
                String appendString = Integer.toHexString(0xFF & publicKey[i])
                        .toUpperCase(Locale.US);
                if (appendString.length() == 1)
                    hexString.append("0");
                hexString.append(appendString);
                hexString.append(":");
            }

            String result = hexString.toString();
            return result.substring(0, result.length() - 1);

        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }
}

在创建应用前可填任意SHA1码,待通过Tools.getSHA1(this)方法获取后再更改

STEP8:自定义离线地图用法 OfflineMapMyActivity (布局文件是新建类默认的)

package com.helloworld.mapdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import android.widget.ListView;

import com.alibaba.idst.nls.internal.utils.L;
import com.amap.api.maps.AMapException;
import com.amap.api.maps.offlinemap.OfflineMapManager;
import com.amap.api.maps.offlinemap.OfflineMapProvince;

import java.util.ArrayList;
import java.util.List;

/**
 * 自定义离线地图用法
 */
public class OfflineMapMyActivity extends AppCompatActivity implements OfflineMapManager.OfflineMapDownloadListener,OfflineMapManager.OfflineLoadedListener {

    private List<OfflineMapProvince> list = new ArrayList<>();

    private OfflineMapManager amapManager;
    private static final String TAG = "OfflineMapMyActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_offline_map_my);

        if (amapManager == null) {
            //构造OfflineMapManager对象
            amapManager = new OfflineMapManager(this, this);
            amapManager.setOnOfflineLoadedListener(this);
        }
        try {
            //按照citycode下载 (城市编码去官网下载即可)
            //amapManager.downloadByCityCode("城市编码");
            //按照cityname下载
            //开始执行下载任务
            amapManager.downloadByCityName("赣州市");
            amapManager.downloadByCityName("深圳市");
            //通过updateOfflineCityByName方法判断离线地图数据是否存在更新
            //amapManager.updateOfflineCityByName("赣州市");
            //城市编码
            //amapManager.updateOfflineCityByCode("城市编码");
            //删除某一城市的离线地图包
            //注意:执行 remove 操作时,需要等待 OfflineLoadedListener 回调之后才可以,
            //否则(即使OfflineMapDownloadListener回调成功)操作将会无效
            //amapManager.remove("赣州市");

            //http://lbs.amap.com/api/android-sdk/guide/create-map/offline-map
            //获取省列表
            amapManager.getOfflineMapProvinceList();
            //获取城市列表
            amapManager.getOfflineMapCityList();
            //获取已下载城市列表
            amapManager.getDownloadOfflineMapCityList();
            //获取正在或等待下载城市列表
            amapManager.getDownloadingCityList();

            /**
             * 用法
             * 其实就是将它作为list数据源传入进去
             */
            //将省份赋值给list
            list = amapManager.getOfflineMapProvinceList();
            //自行新建listView与Adapter
            //listView.setAdapter(MyAdapter);
            Log.e(TAG, "全国省份的大小: " + list.size());
            //遍历全国省份的名称
            for (int i = 0; i < list.size(); i++) {
                Log.e(TAG, "省份的名称: " + list.get(i).getProvinceName());
                Log.e(TAG, "省份的编码: " + list.get(i).getProvinceCode());
                Log.e(TAG, "省份的拼音名称: " + list.get(i).getPinyin());
            }

        } catch (AMapException e) {
            e.printStackTrace();
        }
        //暂停地图的下载
        //amapManager.pause();
        //停止所有当前正在执行的下载,包括下载队列中等待的部分
        //amapManager.stop();
        //离线地图默认会下载到手机存储卡的“amap”目录下,也可以自定义路径:
        //通过 MapInitializer.sdcardDir 设置路径时,需要在 AMap 对象初始化之前进行,否则操作会无效
        //MapsInitializer.sdcardDir="";
    }

    /**
     * 下载任务中的回调
     *
     * @param i  状态码 0为成功 101:下载出错  4:下载完成(其他状态码暂无...)
     * @param i1 下载的进度
     * @param s  所下载的城市名
     */
    @Override
    public void onDownload(int i, int i1, String s) {
        //这里可以加载进度条,(可自行添加)这个方法在下载时会实时回调
        //注意不支持多个城市同时下载,会先执行开头下载的城市,在下载第二个城市
        Log.e(TAG, "onDownload: " + i + "\n" + i1 + "\n" + s);
    }

    /**
     * 检查城市是否有新的离线版本包
     *
     * @param b 是否有更新
     * @param s 检查更新的城市名
     */
    @Override
    public void onCheckUpdate(boolean b, String s) {
        //检查更新的回调 true+城市名
        Log.e(TAG, "onCheckUpdate: " + b + "\n" + s);
    }

    @Override
    public void onRemove(boolean b, String s, String s1) {
        Log.e(TAG, "onRemove: " + b + "\n" + s + "\n" + s1);
    }

    @Override
    public void onVerifyComplete() {
        Log.e(TAG, "onVerifyComplete: ");
    }

    /**
     * 自行实现
     */
    private BaseAdapter MyAdapter = new BaseAdapter() {
        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Object getItem(int i) {
            return list.get(i);
        }

        @Override
        public long getItemId(int i) {
            return i;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            //获取省的名字
            //list.get(i).getProvinceName();
            //获取省的编码
            //list.get(i).getProvinceCode();
            //获取该省的城市列表
            //list.get(i).getCityList();
            return null;
        }
    };
}

打印如下:

这里写图片描述

STEP8:如果定位失败可以到这个网址链接查看错误码说明:http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/ (其中定位失败原因代码中也有)

最后注意APP SHA1和包名要对应一致不要填错 否则会定位到 非洲去…

这里写图片描述

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值