Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能 您所在的位置:网站首页 百度地图离线功能 Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能

Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能

2023-03-16 15:47| 来源: 网络整理| 查看: 265

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37758097

一直觉得地图应用支持离线地图很重要啊,我等移动2G屌丝,流量不易,且用且珍惜。

对于官方开发指南对于离线地图的教程,提供了两种方案:

第一,手动导入,先将从官网下载的离线包解压,把vmp文件夹拷入SD卡根目录下的BaiduMapSDK文件夹内。好吧,我表示不能接受,无视了。

第二,接口下载方法如下:mOffline.start(cityid);还比较靠谱,就是没详细介绍。

今天,我们主要对第二种方式进行详细介绍,然后集成到我们的已经集成了定位方向传感器的地图中,如果你还不了解:Android百度地图 SDK v3.0.0 (三) 添加覆盖物Marker与InfoWindow的使用

效果图: 为了方便,我又添加了个菜单按钮~可以看到能够对下载位置的保存,支持多个等待下载,已经取消下载等。最主要当然是,下载过后,只需要定位的流量(甚至不用)就能很好的使用咱们的地图拉~ 顺便提一下:本来想搞个线程池,支持多个同时下载,这块可能很多不注意会有一些问题,但是百度地图公开出来的start(cityCode)不管我怎么尝试(尝试了多个离线地图实例都不行),每次同时都只能下载一个。 1、百度地图离线相关API介绍 a 、类 MKOfflineMap 提供地图的下载,离线地图列表的获取,已下载地图的查询等 java.util.ArrayList getAllUpdateInfo() 返回各城市离线地图更新信息java.util.ArrayList getHotCityList() 返回热门城市列表java.util.ArrayList getOfflineCityList() 返回支持离线地图城市列表MKOLUpdateElement getUpdateInfo(int cityID) 返回指定城市ID离线地图更新信息 java.util.ArrayList searchCity(java.lang.String cityName) 根据城市名搜索该城市离线地图记录boolean init(MKOfflineMapListener listener) 初使化boolean pause(int cityID) 暂停下载指定城市ID的离线地图boolean remove(int cityID) 删除指定城市ID的离线地图boolean start(int cityID) 启动下载指定城市ID的离线地图 void destroy()  销毁离线地图管理模块,不用时调用 接口 MKOfflineMapListener 离线地图事件通知接口。 void onGetOfflineMapState(int type, int state)   类 MKOLUpdateElement 和 类 MKOLSearchRecord 基本就是包含一些cityName , cityId, size 等等   API在百度的帮助文档中也很详细,下面会在代码中使用这些API。   2、离线地图城市信息的实体Bean package com.zhy.zhy_baidu_ditu_demo00; public class OfflineMapCityBean { private String cityName; private int cityCode; /** * 下载的进度 */ private int progress; private Flag flag = Flag.NO_STATUS; /** * 下载的状态:无状态,暂停,正在下载 * @author zhy * */ public enum Flag { NO_STATUS,PAUSE,DOWNLOADING } public Flag getFlag() { return flag; } public void setFlag(Flag flag) { this.flag = flag; } public OfflineMapCityBean() { } public OfflineMapCityBean(String cityName, int cityCode, int progress) { this.cityName = cityName; this.cityCode = cityCode; this.progress = progress; } public String getCityName() { return cityName; } public void setCityName(String cityName) { this.cityName = cityName; } public int getCityCode() { return cityCode; } public void setCityCode(int cityCode) { this.cityCode = cityCode; } public int getProgress() { return progress; } public void setProgress(int progress) { this.progress = progress; } }

包含了,城市名称:用于listview上的显示,城市id:用于查询下载情况,进度:更新listview下载时的显示,标志:用户开启或者取消下载时的标志。

  3、离线地图的使用 在Actvity启动时,首先初始化离线地图 /** * 初始化离线地图 */ private void initOfflineMap() { mOfflineMap = new MKOfflineMap(); // 设置监听 mOfflineMap.init(new MKOfflineMapListener() { @Override public void onGetOfflineMapState(int type, int state) { switch (type) { case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: // 离线地图下载更新事件类型 MKOLUpdateElement update = mOfflineMap.getUpdateInfo(state); Log.e(TAG, update.cityName + " ," + update.ratio); for (OfflineMapCityBean bean : mDatas) { if (bean.getCityCode() == state) { bean.setProgress(update.ratio); bean.setFlag(Flag.DOWNLOADING); break; } } mAdapter.notifyDataSetChanged(); Log.e(TAG, "TYPE_DOWNLOAD_UPDATE"); break; case MKOfflineMap.TYPE_NEW_OFFLINE: // 有新离线地图安装 Log.e(TAG, "TYPE_NEW_OFFLINE"); break; case MKOfflineMap.TYPE_VER_UPDATE: // 版本更新提示 break; } } }); }

设置离线地图的下载监听接口,目前我们只关注type为MKOfflineMap.TYPE_DOWNLOAD_UPDATE , 此时传入的state为cityId, 然后我们通过mOfflineMap.getUpdateInfo(state);可以获得该城市的下载数据,接下来更新我们listview的数据集,最后刷新界面。

初始化数据: private void initData() { // 获得所有热门城市 ArrayList offlineCityList = mOfflineMap .getHotCityList(); // 手动添加了西安 MKOLSearchRecord xian = new MKOLSearchRecord(); xian.cityID = 233; xian.cityName = "西安市"; offlineCityList.add(xian); // 获得所有已经下载的城市列表 ArrayList allUpdateInfo = mOfflineMap .getAllUpdateInfo(); // 设置所有数据的状态 for (MKOLSearchRecord record : offlineCityList) { OfflineMapCityBean cityBean = new OfflineMapCityBean(); cityBean.setCityName(record.cityName); cityBean.setCityCode(record.cityID); if (allUpdateInfo != null)//没有任何下载记录,返回null,为啥不返回空列表~~ { for (MKOLUpdateElement ele : allUpdateInfo) { if (ele.cityID == record.cityID) { cityBean.setProgress(ele.ratio); } } } mDatas.add(cityBean); } }

进入Activity先通过mOfflineMap.getHotCityList();获得热门城市列表,不过热门里面竟然没有西安,我手动增加了一个西安。(这里我是为了方便,有兴趣的可以列出全国支持的城市);接下来mOfflineMap.getAllUpdateInfo();获得已经下载城市的数据信息;然后就行交叉对比,设置数据源数据。

  初始化listview private void initListView() { mListView = (ListView) findViewById(R.id.id_offline_map_lv); mAdapter = new MyOfflineCityBeanAdapter(); mListView.setAdapter(mAdapter); mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { int cityId = mDatas.get(position).getCityCode(); if (mCityCodes.contains(cityId)) { removeTaskFromQueue(position, cityId); } else { addToDownloadQueue(position, cityId); } } }); }

为listview的item设置点击事件,第一次点击时加入下载队列,第二次点击时取消下载。

listview的适配器 /** * 热门城市地图列表的Adapter * * @author zhy * */ class MyOfflineCityBeanAdapter extends BaseAdapter { @Override public boolean isEnabled(int position) { if (mDatas.get(position).getProgress() == 100) { return false; } return super.isEnabled(position); } @Override public int getCount() { return mDatas.size(); } @Override public Object getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { OfflineMapCityBean bean = mDatas.get(position); ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.offlinemap_item, parent, false); holder.cityName = (TextView) convertView .findViewById(R.id.id_cityname); holder.progress = (TextView) convertView .findViewById(R.id.id_progress); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.cityName.setText(bean.getCityName()); int progress = bean.getProgress(); String progressMsg = ""; // 根据进度情况,设置显示 if (progress == 0) { progressMsg = "未下载"; } else if (progress == 100) { bean.setFlag(Flag.NO_STATUS); progressMsg = "已下载"; } else { progressMsg = progress + "%"; } // 根据当前状态,设置显示 switch (bean.getFlag()) { case PAUSE: progressMsg += "【等待下载】"; break; case DOWNLOADING: progressMsg += "【正在下载】"; break; default: break; } holder.progress.setText(progressMsg); return convertView; } private class ViewHolder { TextView cityName; TextView progress; } }

适配器的代码比较简单,主要就是getView中根本bean的数据设置显示。

最后在我们主Activity增加一个菜单项,打开此Activity就完工了: @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.id_menu_map_offline: Intent intent = new Intent(MainActivity.this, OfflineMapActivity.class); startActivity(intent); break; ... } }

好了,关于百度地图,目前就用到这么多~~如果后期有别的需求,还会继续更新~

    源码点击下载 注:开发者key需要换成自己申请的,不清楚申请的请看第一篇博客的。 Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能的更多相关文章 Android 百度地图 SDK v3.0.0 (四) 离线地图功能介绍

转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直认为地图应用支持离线地图非常重要啊.我等移动2G屌丝,流量不易 ...

Android 百度地图 SDK v3.0.0 (三) 添加覆盖物Marker与InfoWindow的使用

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37737213 上篇博客已经实现了地图的定位以及结合了方向传感器用户路痴定位方向, ...

Android 百度地图 SDK v3.0.0 (三) 加入覆盖Marker与InfoWindow使用

转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37737213 上篇博客已经实现了地图的定位以及结合了方向传感器用户路痴定位方向, ...

Android 百度地图 SDK v3.0.0 (一)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37729091 最近公司要把百度地图集成的项目中,于是我就研究了一天百度地图的SD ...

《第一行代码》(三: Android 百度地图 SDK v3.0.0)

百度地图的SDK变化较大,第一行代码里的demo已经不能用了,一直以为是代码类错误,害我花了很多时间,可以参考这位博主的:http://blog.csdn.net/lmj623565791/artic ...

Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37730469 在上一篇博客中,我们成功把地图导入了我们的项目.本篇我们准备为地图 ...

Android百度地图SDK 导航初始化和地图初始化引起的冲突

如题,相同是百度地图SDK开发过程中遇到的一个问题.交代下背景: 开发了一款内嵌百度地图的应用,因此里面差点儿相同将眼下百度地图SDK开放的主要功能都用到了,定位,地图显示,覆盖物标示.POI搜索,行 ...

Android 百度地图SDK 定位

引用locSDK_6.1.3.jar,切记添加相应的so文件. 1.定位初始化,需要使用getApplicationContext() mLocClient = new LocationClient( ...

Android 百度地图API(01)_开发环境 HelloBaiduMap

转载于:http://blog.csdn.net/lmj623565791/article/details/37729091 转载于:http://blog.csdn.net/crazy1235/ar ...

随机推荐 socket.io实现

后台代码 index_server.js var app = require('http').createServer(handler)//创建服务器app , io = require('socke ...

Java中long和double的原子性

Java中long和double的原子性 java中基本类型中,long和double的长度都是8个字节,32位(4字节)处理器对其读写操作无法一次完成,那么,JVM,long和double是原子性的 ...

hdu1230火星A+B (大数题)

Problem Description 读入两个不超过25位的火星正整数A和B,计算A+B.需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数.例如:地球上的10进制数2,在火星上 ...

不熟悉的CSS样式

1.font连写: 例如:font:15px/23px "ralewayregular","Helvetica Neue",Helvetica,Arial,sa ...

js在html中的加载执行顺序

1.加载顺序:引入标记的出现顺序,依次加载 页面上的Javascript代码是HTML文档的一部分,所以Javascript在页面装载时执行的顺序就是其引入标记< ...

js监听回车事件

标题通俗的说,也就是绑定当用户按下回车键要执行的事件. 下面,入正题. 第一步,先编写简单的页面代码,这里我们只需要一个按钮就足够了.当然,还有按钮事件.



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有