Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37758097
一直觉得地图应用支持离线地图很重要啊,我等移动2G屌丝,流量不易,且用且珍惜。
对于官方开发指南对于离线地图的教程,提供了两种方案:
第一,手动导入,先将从官网下载的离线包解压,把vmp文件夹拷入SD卡根目录下的BaiduMapSDK文件夹内。好吧,我表示不能接受,无视了。
第二,接口下载方法如下:mOffline.start(cityid);还比较靠谱,就是没详细介绍。
今天,我们主要对第二种方式进行详细介绍,然后集成到我们的已经集成了定位方向传感器的地图中,如果你还不了解:Android百度地图 SDK v3.0.0 (三) 添加覆盖物Marker与InfoWindow的使用
1、百度地图离线相关API介绍
java.util.ArrayList<MKOLSearchRecord> getHotCityList() 返回热门城市列表
java.util.ArrayList<MKOLSearchRecord> getOfflineCityList() 返回支持离线地图城市列表
MKOLUpdateElement getUpdateInfo(int cityID) 返回指定城市ID离线地图更新信息
boolean init(MKOfflineMapListener listener) 初使化
boolean pause(int cityID) 暂停下载指定城市ID的离线地图
boolean remove(int cityID) 删除指定城市ID的离线地图
boolean start(int cityID) 启动下载指定城市ID的离线地图
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、离线地图的使用
- /**
- * 初始化离线地图
- */
- 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<MKOLSearchRecord> offlineCityList = mOfflineMap
- .getHotCityList();
- // 手动添加了西安
- MKOLSearchRecord xian = new MKOLSearchRecord();
- xian.cityID = 233;
- xian.cityName = "西安市";
- offlineCityList.add(xian);
- // 获得所有已经下载的城市列表
- ArrayList<MKOLUpdateElement> 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();获得已经下载城市的数据信息;然后就行交叉对比,设置数据源数据。
- 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设置点击事件,第一次点击时加入下载队列,第二次点击时取消下载。
- /**
- * 热门城市地图列表的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的数据设置显示。
- @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;
- ...
- }
- }
好了,关于百度地图,目前就用到这么多~~如果后期有别的需求,还会继续更新~
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 ...
随机推荐
- 【转】C++之内部类(嵌套类)与外部类及友元
[转]http://baike.baidu.com/link?url=Md223wQoT5s-3cZ5xRnj1pGmvm310DKAuh-HDrcEdc2l24rwobHrdEc_Mi4Z3BGP0 ...
- Android单位度量
px(像素):屏幕上的点. in(英寸):长度单位.mm(毫米):长度单位.pt(磅):1/72英寸.dp(与密度无关的像素):一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dp = 1p ...
- 【USACO 2.1.3】三值的排序
[题目描述] 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候.在这个任务中可能的值只有三种1,2和3.我们用交换的方法把他排 ...
- Open vSwitch在openstackHavana概述
最近再看Open vSwitch一些东西,我认为openstack官网上对这一块做了一些了解,所以就把这一块翻译出来以供参考,英语不好,翻译得很粗糙. Open vSwitch插件是最有名的核心插件之 ...
- php 数组 类对象 值传递 引用传递 区别
一般的数据类型(int, float, bool)不做这方面的解说了 这里详细介绍一下数组和的类的对象作为参数进行值传递的区别 数组值传递 实例代码: <?php function main() ...
- APP的测试过程和重点
APP的测试过程和重点 1.首先是测试资源确认及准备 (1)产品需求文档.产品原型图.接口说明文档以及设计说明文档等应齐全: (2)测试设备及工具的准备:IOS和andriod不同版本的真机,以及相关 ...
- uva 10976 Fractions Again(简单枚举)
10976 Fractions Again It is easy to see that for every fraction in the form 1 k (k > 0), we can a ...
- json-lib 使用教程
//关于java map与JSONObject类互相转换 Map<String,Object> map=new HashMap<String,Object>(); map.pu ...
- optimize the performance
http://en.wikipedia.org/wiki/Web_Performance_Optimization http://www.stevesouders.com/blog/2011/08/2 ...
- ISO 7810 协议小结
ISO 7816规定了Smart Card的传输协议分为 T=0 异步半双工字符传输协议 T=1 异步半双工块传输协议 T=0命令介绍 命令总是由接口设备启动,他以一个5字节的报头通知卡要做什么,然后 ...