百度地图离线包手机版离线地图下载

android 百度地图离线地图功能
最近做了一个百度地图离线地图的功能,虽然功能实现了,但过程中也碰到了一些问题。首先,看看效果图吧。
1、离线地图相关API
MKOfflineMap类
主要的一个类,提供了离线地图的管理功能,例如,下载,暂停、更新,删除等功能。每次只允许一个下载任务进行,后面的需要排队。
void destroy()
销毁离线地图管理模块,不用时调用 java.util.ArrayList& MKOLUpdateElement& getAllUpdateInfo()
返回各城市离线地图更新信息,已下载的离线地图 java.util.ArrayList& MKOLSearchRecord& getHotCityList()
返回热门城市列表 java.util.ArrayList getOfflineCityList()
返回支持离线地图城市列表 MKOLUpdateElement getUpdateInfo(int cityID)
返回指定城市ID离线地图更新信息 boolean init(MKOfflineMapListener listener)
初使化 boolean pause(int cityID)
暂停下载或更新指定城市ID的离线地图 boolean remove(int cityID)
删除指定城市ID的离线地图 java.util.ArrayList& MKOLSearchRecord& searchCity(java.lang.String
根据城市名搜索该城市离线地图记录 boolean start(int cityID)
启动下载指定城市ID的离线地图,或在暂停更新某城市后继续更新下载某城市离线地图 boolean update(int cityID)
启动更新指定城市ID的离线地图
MKOLSearchRecord类
离线地图搜索城市记录结构
java.util.ArrayList& MKOLSearchRecord& childCities
子城市列表 int cityID
城市ID java.lang.String cityName
城市名称 int cityType
城市类型0:全国;1:省份;2:城市,如果是省份,可以通过childCities得到子城市列表 int size
数据包总大小
MKOLUpdateElement类
离线地图更新信息,下面是其中的一些字段
int cityID
城市ID java.lang.String cityName
城市名称 static int DOWNLOADING
正在下载 LatLng geoPt
城市中心点坐标 int level
离线包地图层级 int ratio
下载比率,100为下载完成 int serversize
服务端数据大小 int size
已下载数据大小 int status
下载状态 boolean update
是否为更新
MKOfflineMapListener接口
该接口返回新安装离线地图、下载更新、数据版本更新等结果,用户需要实现该接口以处理相应事件。里面有一个唯一的方法:
void onGetOfflineMapState(int type, int state) 返回通知事件
2、主要代码
OfflineActivity类
/* 此Demo用来演示离线地图的下载和显示 */
public class OfflineActivity extends Activity implements MKOfflineMapListener {
private MKOfflineMap mOffline =
private TextView cidV
private TextView stateV
private EditText cityNameV
private HashMap hashMap = new HashMap(); //是否已下载;
private CityExpandableListA
private HotcityListAdapter hA
private OfflineHandler offlineH
private MKOLSearchRecord currentR
private ArrayList loadingList = new ArrayList();
private ArrayList loadedList = new ArrayList();
public HashMap clickM
* 已下载的离线地图信息列表
public ArrayList localMapList =
private LocalMapAdapter lAdapter =
private loadingMapAdapter dAdapter =
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_offline);
ImageButton back = (ImageButton) findViewById(R.id.back);
back.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
OfflineActivity.this.finish();
offlineHandler = new OfflineHandler(this);
mOffline = new MKOfflineMap();
mOffline.init(this);
initView();
initCurLocation();
LocationManager lm = // location管理器
LocationClient mLocC
private void initCurLocation()
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (lm != null) {
// 定位初始化
mLocClient = new LocationClient(this);
mLocClient.registerLocationListener(new MyLocationListenner());
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType(&bd09ll&); // 设置坐标类型
option.setPriority(LocationClientOption.NetWorkFirst);//设置网络优先(不设置,默认是gps优先)
option.setAddrType(&all&);// 返回的定位结果包含地址信息
option.setScanSpan(10000);// 设置发起定位请求的间隔时间为10s(小于1秒则一次定位)
mLocClient.setLocOption(option);
mLocClient.start();
SystemUtil.showMessage(&请打开GPS定位设置&);
public void setCurrentLocation(String currentLocation) {
TextView current = (TextView) findViewById(R.id.current_name);
current.setText(currentLocation);
currentRecord = search(currentLocation);
RelativeLayout currentItem = (RelativeLayout)findViewById(R.id.current_item);
currentItem.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (hashMap.get(currentRecord.cityName))
Toast.makeText(OfflineActivity.this, &离线地图已下载&, Toast.LENGTH_LONG).show();
TextView currentSize = (TextView) v.findViewById(R.id.current_size);
currentSize.setText(&正在下载&);
start(currentRecord.cityID);
public class MyLocationListenner implements BDLocationListener {
public void onReceiveLocation(BDLocation location) {
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
String address=location.getAddrStr();
String city=location.getCity();
System.out.println(&地址:&+address+&城市:&+city);
setCurrentLocation(city);
public void onReceivePoi(BDLocation poiLocation) {
private void initView() {
// 获取已下过的离线地图信息
localMapList = mOffline.getAllUpdateInfo();
if (localMapList == null) {
localMapList = new ArrayList();
ListView localMapListView = (ListView) findViewById(R.id.localmaplist);
lAdapter = new LocalMapAdapter();
localMapListView.setAdapter(lAdapter);
ListView loadingListView = (ListView)findViewById(R.id.lodinglist);
dAdapter = new loadingMapAdapter();
loadingListView.setAdapter(dAdapter);
cidView = (TextView) findViewById(R.id.cityid);
cityNameView = (EditText) findViewById(R.id.city);
stateView = (TextView) findViewById(R.id.state);
ListView hotCityList = (ListView) findViewById(R.id.hotcitylist);
final ArrayList hotCities = new ArrayList();
// 获取热门城市列表
final ArrayList records1 = mOffline.getHotCityList();
if (records1 != null) {
for (MKOLSearchRecord r : records1) {
hotCities.add(r.cityID);
hAdapter = new HotcityListAdapter(this, records1,hashMap);
hotCityList.setAdapter(hAdapter);
hotCityList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView parent, View view, int position, long id) {
if (hashMap.get(records1.get(position).cityName))
Toast.makeText(OfflineActivity.this, &离线地图已下载&, Toast.LENGTH_LONG).show();
TextView childSize = (TextView) view.findViewById(R.id.child_size);
childSize.setText(&正在下载&);
start(records1.get(position).cityID);
ExpandableListView allCityList = (ExpandableListView) findViewById(R.id.allcitylist);
// 获取所有支持离线地图的城市
final ArrayList records2 = mOffline.getOfflineCityList();
clickMap = new HashMap();
if (records1 != null) {
for (MKOLSearchRecord r : records2) {
allCities.add(r.cityName+&--& + this.formatDataSize(r.size));
allCitiyIds.add(r.cityID);
hashMap.put(r.cityName,downList(r.cityName));
clickMap.put(r.cityName, &0&);
if (r.childCities != null && r.childCities.size() != 0)
ArrayList childrecord = r.childC
for (MKOLSearchRecord cr : childrecord)
hashMap.put(cr.cityName,downList(cr.cityName));
adapter = new CityExpandableListAdapter(this,records2,hashMap);
allCityList.setAdapter(adapter);
allCityList.setGroupIndicator(null);
hAdapter.notifyDataSetChanged();
allCityList.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
if (records2 != null )
MKOLSearchRecord record = records2.get(groupPosition);
if (record.childCities == null)
if (hashMap.get(record.cityName))
Toast.makeText(OfflineActivity.this, &离线地图已下载&, Toast.LENGTH_LONG).show();
System.out.println(&simplename:&+v.getClass().getSimpleName());
int cd = record.cityID;
start(cd);
/* int size = ((ViewGroup)v).getChildCount();
for (int i = 0 ; i& i++)
View child = ((ViewGroup)v).getChildAt(i);
System.out.println(&simplename:&+child.getClass().getSimpleName());
View child = ((ViewGroup)v).getChildAt(1);
((TextView)child).setText(&正在下载&);*/
clickMap.put(record.cityName, &1&);
adapter.notifyDataSetChanged();
allCityList.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
if (records2 != null)
MKOLSearchRecord record = records2.get(groupPosition);
MKOLSearchRecord cldred = record.childCities.get(childPosition);
if (hashMap.get(cldred.cityName))
Toast.makeText(OfflineActivity.this, &离线地图已下载&, Toast.LENGTH_LONG).show();
TextView childSize = (TextView) v.findViewById(R.id.child_size);
childSize.setText(&正在下载&);
start(cldred.cityID);
LinearLayout cl = (LinearLayout) findViewById(R.id.citylist_layout);
LinearLayout lm = (LinearLayout) findViewById(R.id.localmap_layout);
lm.setVisibility(View.GONE);
cl.setVisibility(View.VISIBLE);
public boolean downList(String cityName)
Boolean flag =
if (localMapList != null)
for (int i = 0; i
records = mOffline.searchCity(city);
if (records == null || records.size() != 1) {
cidView.setText(String.valueOf(records.get(0).cityID));
TextView current_size = (TextView) findViewById(R.id.current_size);
if (hashMap.get(records.get(0).cityName))
current_size.setText(&已下载&);
current_size.setText(formatDataSize(records.get(0).size));
return records.get(0);
* 开始下载
public void start(int cityid) {
int cityid = Integer.parseInt(cidView.getText().toString());
mOffline.start(cityid);
clickLocalMapListButton(null);
Toast.makeText(this, &开始下载离线地图. cityid: & + cityid, Toast.LENGTH_SHORT).show();
updateView(null, false);
* 暂停下载
* @param view
public void stop(View view) {
int cityid = Integer.parseInt(cidView.getText().toString());
mOffline.pause(cityid);
Toast.makeText(this, &暂停下载离线地图. cityid: & + cityid, Toast.LENGTH_SHORT)
updateView(null, false);
* 删除离线地图
* @param view
public void remove(View view) {
int cityid = Integer.parseInt(cidView.getText().toString());
mOffline.remove(cityid);
Toast.makeText(this, &删除离线地图. cityid: & + cityid, Toast.LENGTH_SHORT)
updateView(null,false);
* 更新状态显示
public void updateView(MKOLUpdateElement element, boolean flag) {
localMapList = mOffline.getAllUpdateInfo();
if (localMapList == null) {
localMapList = new ArrayList();
loadingList.clear();
loadedList.clear();
for (MKOLUpdateElement element1 : localMapList)
if (element1.ratio != 100)
loadingList.add(element1);
loadedList.add(element1);
if (element != null)
hashMap.put(element.cityName, flag);
if (currentRecord.cityID == element.cityID)
TextView currentSize = (TextView) findViewById(R.id.current_size);
currentSize.setText(&已下载&);
currentSize.setText(formatDataSize(element.size));
adapter.notifyDataSetChanged();
hAdapter.notifyDataSetChanged();
lAdapter.notifyDataSetChanged();
dAdapter.notifyDataSetChanged();
protected void onPause() {
int cityid = Integer.parseInt(cidView.getText().toString());
MKOLUpdateElement temp = mOffline.getUpdateInfo(cityid);
if (temp != null && temp.status == MKOLUpdateElement.DOWNLOADING) {
mOffline.pause(cityid);
super.onPause();
protected void onResume() {
super.onResume();
public String formatDataSize(int size) {
String ret = &&;
if (size & (1024 * 1024)) {
ret = String.format(&%dK&, size / 1024);
ret = String.format(&%.1fM&, size / (1024 * 1024.0));
protected void onDestroy() {
* 退出时,销毁离线地图模块
mOffline.destroy();
super.onDestroy();
public void onGetOfflineMapState(int type, int state) {
switch (type) {
case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: {
MKOLUpdateElement update = mOffline.getUpdateInfo(state);
// 处理下载进度更新提示
if (update != null) {
stateView.setText(String.format(&%s : %d%%&, update.cityName,
update.ratio));
System.out.println(&ratio:&+update.ratio);
if (update.ratio == 100)
updateView(update,true);
updateView(null, false);
case MKOfflineMap.TYPE_NEW_OFFLINE:
// 有新离线地图安装
Log.d(&OfflineDemo&, String.format(&add offlinemap num:%d&, state));
case MKOfflineMap.TYPE_VER_UPDATE:
// 版本更新提示
// MKOLUpdateElement e = mOffline.getUpdateInfo(state);
* 正在下载城市列表适配器
public class loadingMapAdapter extends BaseAdapter{
public int getCount() {
return loadingList.size();
public Object getItem(int position) {
return loadingList.get(position);
public long getItemId(int position) {
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
convertView = LayoutInflater.from(OfflineActivity.this).inflate(R.layout.loding_list, null);
TextView name = (TextView) convertView.findViewById(R.id.city_name);
TextView size = (TextView)convertView.findViewById(R.id.city_size);
TextView ratio = (TextView)convertView.findViewById(R.id.down_ratio);
ImageButton manager= (ImageButton) convertView.findViewById(R.id.down_manager);
final MKOLUpdateElement ele = loadingList.get(position);
name.setText(ele.cityName);
size.setText(formatDataSize(ele.size));
ratio.setText(ele.ratio+&%&);
manager.setOnClickListener(new OnClickListener() {
boolean flag =
public void onClick(View v) {
if (flag) {
mOffline.pause(ele.cityID);
v.setBackgroundResource(R.drawable.loading_start);
mOffline.start(ele.cityID);
v.setBackgroundResource(R.drawable.loading_pause);
return convertV
* 离线地图管理列表适配器
public class LocalMapAdapter extends BaseAdapter {
public int getCount() {
return loadedList.size();
public Object getItem(int index) {
return loadedList.get(index);
public long getItemId(int index) {
public View getView(int index, View view, ViewGroup arg2) {
MKOLUpdateElement e = (MKOLUpdateElement) getItem(index);
view = View.inflate(OfflineActivity.this,
R.layout.offline_localmap_list, null);
initViewItem(view, e);
void initViewItem(View view, final MKOLUpdateElement e) {
Button remove = (Button) view.findViewById(R.id.remove);
TextView title = (TextView) view.findViewById(R.id.title);
TextView update = (TextView) view.findViewById(R.id.update);
TextView ratio = (TextView) view.findViewById(R.id.ratio);
Button doUpdate = (Button) view.findViewById(R.id.exe_update);
ratio.setText(e.ratio + &%&);
title.setText(e.cityName);
if (e.update) {
update.setText(&可更新&);
update.setText(&最新&);
remove.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
mOffline.remove(e.cityID);
clickMap.put(e.cityName,&0&);
updateView(e, false);
doUpdate.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mOffline.update(e.cityID);
布局文件activity_offline.xml
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'使用JavaScript编写,适用网页中嵌入地图服务,支持2D/3D、卫星、街景、室内实景及定制化地图展现。
发送HTTP请求,获取数据存储和检索、POI数据、地址解析、坐标转换、IP定位、车联网等服务。
Android开发
适用Android平台APP中实现地图展示、信息搜索、定位、导航等功能,提供全面的LBS解决方案。
适用iOS移动设备应用中实现地图展示、POI搜索、导航等功能,帮用户轻松搭建专业的LBS类应用。
不嵌广告,同量收入
为开发者提供全网最优质的团购电影酒店等商户服务信息,零开发成本集成本地服务;提升开发者应用的用户活跃度,更可获得不俗的佣金分成收入。
限量内测中,欢迎开发者参与
和双端产品上线
插件与工具01图吧导航(3D离线地图包) v9.0.1.1 离线版01
地图旅游 / 29.9M02高德导航破解版 v7.5. 手机安卓版02
地图旅游 / 15.4M03凯立德手机导航 v7.3 安卓版03
地图旅游 / 17.6M04凯立德导航离线版下载 v6.2.1 安卓版04
地图旅游 / 16.2M05最新全国电子狗 v3.0.7.0 安卓版05
地图旅游 / 9.4M06百度导航 V4.7.15 离线地图包 安卓版06
地图旅游 / 35.5M07手机qq地图 V1.0 beta3 安卓版07
地图旅游 / 963KB08汇通天下旅行小助手 V1.0 Android 简体中文官方安装版08
地图旅游 / 863KB098684公交查询下载 v13.2.9 带离线数据包 安卓版09
地图旅游 / 13M10凯立德手机导航软件破解版 安卓版 4.0 免费版10
地图旅游 / 1.86G
01图吧导航(3D离线地图包) v9.0.1.1 离线版01
地图旅游 / 29.9M02高德导航破解版 v7.5. 手机安卓版02
地图旅游 / 15.4M03凯立德手机导航 v7.3 安卓版03
地图旅游 / 17.6M04凯立德导航离线版下载 v6.2.1 安卓版04
地图旅游 / 16.2M05最新全国电子狗 v3.0.7.0 安卓版05
地图旅游 / 9.4M06百度导航 V4.7.15 离线地图包 安卓版06
地图旅游 / 35.5M07手机qq地图 V1.0 beta3 安卓版07
地图旅游 / 963KB08汇通天下旅行小助手 V1.0 Android 简体中文官方安装版08
地图旅游 / 863KB098684公交查询下载 v13.2.9 带离线数据包 安卓版09
地图旅游 / 13M10凯立德手机导航软件破解版 安卓版 4.0 免费版10
地图旅游 / 1.86G
百度导航 V4.7.15 离线地图包 安卓版
共5人评分 | 共0人评论
百度导航离线地图包是一款支持实时路况、离线收藏,超炫3D及卫星图,还能够随意定位,商场查询,公交线路及生活信息阅览。是一款非常强大的路线查询软件,支持全国23省份和直辖市特别行政区使用。【百度导航 特点】1.零流量体验,检索,规划,导航全部离线化,通通无需联网,拔了卡都可以; 2.海量电子眼数据,即时提醒,即使陌生地点也不必担心违规罚单,百度导航,值得信赖。 3.覆盖各大城市的路口放大图,复杂路,轻松掌握; 4.多点线路规划,可在线路规划中随意增加途径目的地,即使你去再多地方,百度导航一次搞定。 5.“搜周边”,周边生活搜索,更全面满足你的生活需求, 6.合理的路线方案,精准的语音引导,给你简单可依赖的驾车导航体验。【更新日志】V4.7.101、不走高速,更多偏好选择;2、附属地点展示,目的地更明确;3、多项功能、体验优化;v4.3.51. 修复部分bug2. 优化路线规划算法v4.3.01、实时停车场车位信息;2、车生活增加找车位、找代驾服务;3、新增省电模式导航;4、首页改版,支持更多导航功能;5、导航中车道线展示;6、导航中备选路线选择;7、多项功能优化,改善使用体验;V4.2.11.行进中躲避拥堵,随时切换更优路线。2.沿途搜索,寻找沿途地点。3.萌萌哒个性语音,萌翻双耳。4.恢复正北向上模式,如您所需。5.路况订阅提醒,拥堵早知道。6.优化性能、改善体验。v4.1.41、导航里程赚积分,返现换大礼;2、目的地停车场推荐,方便、直达;3、修复bug、优化功能和界面,体验更佳;V4.0.01、数据极速更新,时刻保持道路最新,不走冤枉路。2、在线、离线双模式导航,既省空间又省流量。3、全局语音操控,说出“小度你好”,小度随时为你服务。4、首创地图、车载双模式导航,手机导航也有车载体验。5、全新地图动画,绚丽、平稳、流畅,导航更酷更舒服。6、预测路况,规划出行时间,包办你的出行,不仅仅是导航。7、路线偏好更多,省钱、省时间、爱高速,助你个性化出行。v3.3.01、高速看板上线:全面优化在高速路上的导航体验!2、Handsfree邀您体验,导航时释放双手,用语音来操作!3、增加2014年春季电子眼数据,快去试试电子狗!4、更新全国新开通的189条重要道路,道路覆盖领跑导航产品。5、优化搜索结果排序,常去的地点会在前面。6、优化偏航重算路策略,不会再让您频繁调头了v3.2.11、解决V3.2版1月27日部分新安装用户,App启动后自动重启的bug2、丰富引导信息:”前方第二个红绿灯右转“,更贴心易懂。3、新增轨迹记录、分享功能,做您最好用的行车日志。4、新增里程排行榜,iPad、加油卡免费送。5、更新2013冬季最新数据。6、首页卡片可自由管理、定制。7、优化停车场、出入门的地图展示。v3.2.01、丰富引导信息:“前方第二个红绿灯右转”,更贴心易懂。2、新增轨迹记录、分享功能,做您最好用的行车日志。3、新增里程排行榜,iPad、加油卡免费送。4、更新2013冬季最新数据。5、首页卡片可自由管理、定制。6、优化停车场、出入门的地图展示。
软件名称:百度导航 V4.7.15 离线地图包 安卓版
类型:地图旅游
大小:35.5M
语言:简体中文
更新时间:15-12-01
软件名称:
类型:地图旅游
大小:66.3M
语言:简体中文
更新时间:16-07-09
共0人参与,0条评论(您的评论需要经过审核才能显示)
起点软件 - 所有软件均来自网络如有版权问题请联系我们 - 浙ICP备号
Copyright & 2004- online services. All rights reserved.
请简要描述您遇到的错误,我们将尽快予以修订

我要回帖

更多关于 新版百度地图离线下载 的文章

 

随机推荐