Android百度离线地图_android 百度地图查看是否 有无网络_-无-怨-无-悔-的博客-程序员宅基地

技术标签: android  百度离线地图  Android  

版权声明:本文为博主原创文章,未经博主允许不得转载。


http://lbsyun.baidu.com/index.php?title=androidsdk(百度地图官网地址),大家可以在官网上下载demon程序,申请自己的key后进行测试


我们要清楚自己使用自己要用的离线地图功能,分为两种:一种是直接使用无具体位置信息的地图,这种情况不需要申请key;第二种情况是下载离线地图包,正常显示一个城市的地图信息。

对于第一种情况,我们只需要利用百度地图提供的sdk,根据gps或者其他方式获取的经纬度信息将物体显示在地图上,这个时候百度地图起到的作用仅仅是为我们提供了一种经纬度信息与其在地图上显示的关系的转换,比如我们玩的有些游戏需要显示相对位置和绝对位置。

<com.baidu.mapapi.map.MapView
        android:id="@+id/mapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />

SDKInitializer.initialize(Context context);//使用百度地图必须加

MapView mMapView = (MapView) findViewById(R.id.mapView);

BaiduMap mBaiduMap = mMapView.getMap();

mMapView.getChildAt(1).setVisibility(View.GONE);//隐藏logo
mMapView.getChildAt(2).setVisibility(View.GONE);//隐藏放大缩小按钮
mMapView.getChildAt(3).setVisibility(View.GONE);//隐藏比例尺图标

//设置比例尺大小

MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(5.0f);
mBaiduMap.setMapStatus(msu);

//定位到中心位置

LatLng latLng;

MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.setMapStatus(u);

//添加覆盖物

OverlayOptions overlayOptions = new MarkerOptions().position(latLng)
.icon(BitmapDescriptorFactory.fromView(view))
.zIndex(5);

Marker marker = mBaiduMap.addOverlay(overlayOptions);

Marker提供显示、隐藏、位置......

//管理覆盖物

HashMap hashMap;

hashMap.put(value, marker);

//覆盖物点击事件

Bundle bundle =  new Bundle();
bundle.putSerializable("key", value);
marker.setExtraInfo(bundle);

mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener()
{
@Override
public boolean onMarkerClick(final Marker marker)
{
//
marker.getExtraInfo().get("key");

return true;
}
});

//GPS转百度地图坐标

CoordinateConverter converter = new CoordinateConverter();

converter.from(CoordType.GPS); converter.coord(latlng); 

LatLng desLatLng  = converter.convert();


对于第二种情况,我们需要利用百度地图提供的sdk以及在百度地图官网上申请对应的应用程序的key才可以下载离线地图包。

使用离线地图,可满足在无网络环境下查看地图信息的需求,此外,在有离线地图的情况下,SDK会优先加载离线地图使用(也就是说我们下载了离线地图,在不需要在程序中加其他的代码,就可以优先加载离线地图),减少用户流量方面的开销,为用户提供更流畅的地图服务体验。

离线地图资源可通过SDK“在线下载离线包接口”下载获取。 自v3.6.0起,官网不再支持地图离线包下载,所以SDK去掉“手动导入离线包接口”,SDK在线下载离线包接口仍维持不变。

以下代码为百度地图官网提供的Android平台下载离线地图的方法:

package baidumapsdk.demo.map;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;


import com.baidu.mapapi.map.offline.MKOLSearchRecord;
import com.baidu.mapapi.map.offline.MKOLUpdateElement;
import com.baidu.mapapi.map.offline.MKOfflineMap;
import com.baidu.mapapi.map.offline.MKOfflineMapListener;


import java.util.ArrayList;
import baidumapsdk.demo.R;


/* 此Demo用来演示离线地图的下载和显示 */
public class OfflineDemo extends Activity implements MKOfflineMapListener {


    private MKOfflineMap mOffline = null;
    private TextView cidView;
    private TextView stateView;
    private EditText cityNameView;
    /**
     * 已下载的离线地图信息列表
     */
    private ArrayList<MKOLUpdateElement> localMapList = null;
    private LocalMapAdapter lAdapter = null;


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_offline);
        mOffline = new MKOfflineMap();
        mOffline.init(this);
        initView();


    }


    private void initView() {


        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);
        ArrayList<String> hotCities = new ArrayList<String>();
        // 获取热闹城市列表
        ArrayList<MKOLSearchRecord> records1 = mOffline.getHotCityList();
        if (records1 != null) {
            for (MKOLSearchRecord r : records1) {
                hotCities.add(r.cityName + "(" + r.cityID + ")" + "   --"
                        + this.formatDataSize(r.size));
            }
        }
        ListAdapter hAdapter = (ListAdapter) new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, hotCities);
        hotCityList.setAdapter(hAdapter);


        ListView allCityList = (ListView) findViewById(R.id.allcitylist);
        // 获取所有支持离线地图的城市
        ArrayList<String> allCities = new ArrayList<String>();
        ArrayList<MKOLSearchRecord> records2 = mOffline.getOfflineCityList();
        if (records1 != null) {
            for (MKOLSearchRecord r : records2) {
                allCities.add(r.cityName + "(" + r.cityID + ")" + "   --"
                        + this.formatDataSize(r.size));
            }
        }
        ListAdapter aAdapter = (ListAdapter) new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, allCities);
        allCityList.setAdapter(aAdapter);


        LinearLayout cl = (LinearLayout) findViewById(R.id.citylist_layout);
        LinearLayout lm = (LinearLayout) findViewById(R.id.localmap_layout);
        lm.setVisibility(View.GONE);
        cl.setVisibility(View.VISIBLE);


        // 获取已下过的离线地图信息
        localMapList = mOffline.getAllUpdateInfo();
        if (localMapList == null) {
            localMapList = new ArrayList<MKOLUpdateElement>();
        }


        ListView localMapListView = (ListView) findViewById(R.id.localmaplist);
        lAdapter = new LocalMapAdapter();
        localMapListView.setAdapter(lAdapter);


    }


    /**
     * 切换至城市列表
     *
     * @param view
     */
    public void clickCityListButton(View view) {
        LinearLayout cl = (LinearLayout) findViewById(R.id.citylist_layout);
        LinearLayout lm = (LinearLayout) findViewById(R.id.localmap_layout);
        lm.setVisibility(View.GONE);
        cl.setVisibility(View.VISIBLE);


    }


    /**
     * 切换至下载管理列表
     *
     * @param view
     */
    public void clickLocalMapListButton(View view) {
        LinearLayout cl = (LinearLayout) findViewById(R.id.citylist_layout);
        LinearLayout lm = (LinearLayout) findViewById(R.id.localmap_layout);
        lm.setVisibility(View.VISIBLE);
        cl.setVisibility(View.GONE);
    }


    /**
     * 搜索离线需市
     *
     * @param view
     */
    public void search(View view) {
        ArrayList<MKOLSearchRecord> records = mOffline.searchCity(cityNameView
                .getText().toString());
        if (records == null || records.size() != 1) {
            return;
        }
        cidView.setText(String.valueOf(records.get(0).cityID));
    }


    /**
     * 开始下载
     *
     * @param view
     */
    public void start(View view) {
        int cityid = Integer.parseInt(cidView.getText().toString());
        mOffline.start(cityid);
        clickLocalMapListButton(null);
        Toast.makeText(this, "开始下载离线地图. cityid: " + cityid, Toast.LENGTH_SHORT)
                .show();
        updateView();
    }


    /**
     * 暂停下载
     *
     * @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)
                .show();
        updateView();
    }


    /**
     * 删除离线地图
     *
     * @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)
                .show();
        updateView();
    }


    /**
     * 更新状态显示
     */
    public void updateView() {
        localMapList = mOffline.getAllUpdateInfo();
        if (localMapList == null) {
            localMapList = new ArrayList<MKOLUpdateElement>();
        }
        lAdapter.notifyDataSetChanged();
    }


    @Override
    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();
    }


    @Override
    protected void onResume() {
        super.onResume();
    }


    public String formatDataSize(int size) {
        String ret = "";
        if (size < (1024 * 1024)) {
            ret = String.format("%dK", size / 1024);
        } else {
            ret = String.format("%.1fM", size / (1024 * 1024.0));
        }
        return ret;
    }


    @Override
    protected void onDestroy() {
        /**
         * 退出时,销毁离线地图模块
         */
        mOffline.destroy();
        super.onDestroy();
    }


    @Override
    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));
                    updateView();
                }
            }
                break;
            case MKOfflineMap.TYPE_NEW_OFFLINE:
                // 有新离线地图安装
                Log.d("OfflineDemo", String.format("add offlinemap num:%d", state));
                break;
            case MKOfflineMap.TYPE_VER_UPDATE:
                // 版本更新提示
                // MKOLUpdateElement e = mOffline.getUpdateInfo(state);


                break;
            default:
                break;
        }


    }


    /**
     * 离线地图管理列表适配器
     */
    public class LocalMapAdapter extends BaseAdapter {


        @Override
        public int getCount() {
            return localMapList.size();
        }


        @Override
        public Object getItem(int index) {
            return localMapList.get(index);
        }


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


        @Override
        public View getView(int index, View view, ViewGroup arg2) {
            MKOLUpdateElement e = (MKOLUpdateElement) getItem(index);
            view = View.inflate(OfflineDemo.this,
                    R.layout.offline_localmap_list, null);
            initViewItem(view, e);
            return view;
        }


        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);
            ratio.setText(e.ratio + "%");
            title.setText(e.cityName);
            if (e.update) {
                update.setText("可更新");
            } else {
                update.setText("最新");
            }


            remove.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    mOffline.remove(e.cityID);
                    updateView();
                }
            });
        }


    }


}


如何测试我们的代码在关掉网络后调用的是离线地图:

关掉网络,在加载地图定位中心点时指定一个地图上存在的经纬度信息,同时将比例尺尽量设置在可视范围内

LatLng ll = new LatLng(30.479176, 114.423742);
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chenhande1990chenhan/article/details/53730050

智能推荐

spring 整合hibernate注解时候,出现“Unknown entity: com.ssh.entry.Admin; nested exception is org.hibernate.Map...-程序员宅基地

今天学习使用ssh框架的时候,出现一个异常,弄了好久才找到,在这记录一下,我的sb错误1.spring整合hibernate,取代*.hbm.xml配置文件在applicationContext.xml文件中配置方式 `<!-- 数据库连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.C...

Ubuntu 12.10 安装 compiz 及 emerald-程序员宅基地

要更改主题的同学们注意了!compiz不光可以启用3D效果,搭配emerald theme manager还可以使用emerald主题呢。先下载安装compiz重要的是要安装 compiz fusion icon,启用emerald就在这里面设置!在ubuntu软件中心里搜索compiz即可。然后安装emerald先安装一些相关的包:sudo apt-get install..._ubuntu compiz按转哪几个包

分布式存储系统Kudu(一)、核心原理_kudu存储目录解析-程序员宅基地

在前面的篇章中我们介绍了分布式文件系统HDFS 以及列式存储HBase,HDFS提供了可以横向扩展的存储引擎,适合离线分析场景,不适合于随机读写。HBase适合于随机读写,但由于Scan消耗性能,因此不适合于离线分析场景。因此既可以实现数据的快速插入与实时更新,又能实现对数据的快速分析的Kudu出现了。Apache Kudu 是由Cloudera 开源的存储引擎,可以同时提供低延迟的随机读写和高效的数据分析能力。它是一个融合 HDFS 和 HBase 的功能的新组件,具备介于两者之间的新存储组件。Kud_kudu存储目录解析

【资料】9 W字 | 阿宝哥 · 242 页前端进阶资料-程序员宅基地

2020 年 08 月 03 号 <<前端进阶篇>> 1.0 版本正式发布了,首发一周的下载量突破 2K,截止目前的下载量 2864,浏览量为 1290。首先这得...

吃光肉的骨头——扔掉 OpenSolaris难逃厄运?-程序员宅基地

OpenSolaris是一个由SUN公司(现已被Oracle收购)所发起的开放源码操作系统项目,用来建立以Solaris操作系统为主的开发者社群,专案的适用对象主要是开发者(也就是软件设计师、程序员)、系统管理者(资讯管理师、资管师、资管员)以及使用者(用户),透过这些人期望能使Solaris获得进一步的发展与强化。但是最近一个不幸的消息降临到了OpenSolaris的用...

LeetCode | 字符串反转,旋转相关题目整合 |_旋转字符串相关题目_算法真不会的博客-程序员宅基地

字符串反转相关题目力扣189.旋转数组(直接点击即可跳转,以下相同)思路分析代码实现力扣344.反转字符串思路分析代码实现力扣541.反转字符串Ⅱ思路分析代码实现力扣151.翻转字符串里的单词(字节题库)思路分析代码实现剑指offer58-Ⅱ.左旋转字符串(字节题库)思路分析代码实现力扣189.旋转数组(直接点击即可跳转,以下相同)思路分析举个栗子,如果要k=15,size也是7,那么k%size=1,实际就是旋转了两个周期,然后右旋转一次,所以就是 7 1 2 3 4 5 6 ,那么我们直接re_旋转字符串相关题目

随便推点

旋转矩阵和四元数的几个基本知识点_反对称符号可以看作叉乘-程序员宅基地

1.旋转矩阵的四元数表示我们知道,旋转矩阵也可以用四元数来描述。一个四元数由一个实部和三个虚部组成,通常可写为如下形式: 或者 其中,前边的为实部,为虚部。由于实部为标量,虚部为矢量,所以可写为:..._反对称符号可以看作叉乘

spring4整合xfire1.2.6的问题解决-程序员宅基地

历史原因,需要用xfire发布webservice,项目用了spring4,整合几个坑,记录下(其他的配置忽略,相关资料比较多):1. xfire定义bean的时候,用了singleton 属性,在spring4里已经不存在,需要删除该属性。 找出来 xfire-all-1.2.6.jar里的 org/codehaus/xfire/spring目录的 xfire.xml...

简单WIFI定位分析与比较(文末有手机采集RSSI软件推荐!!!)_如何采集手机wifi rssi 信号-程序员宅基地

导师是做室内定位的,最近让我复现一篇论文中基于图像和WiFi融合定位的实现方法,目前图像定位已经简单的实现了,采用HOG+SVM。然鹅定位效果并不理想,但也能得出个大概的位置。下面就开始搞基于WIFI无线信号定位,特写下此文章以记录。基于WIFI的定位主要有以下两大途径:1、基于RSSI(Received Signal Strength Indicator,信号接收强度)的,主要有以下两种方..._如何采集手机wifi rssi 信号

ifconfig、netstat、route、vconfig命令找不到_route 命令不存在-程序员宅基地

ifconfig、netstat、route、vconfig命令是net-tools里的功能,如果linux默认没有,则会提示命令找不到; 1、在线安装yum install net-tools或者apt-get install net-tools 2、离线安装登录 http://rpm.pbone.net/ 搜索net-tools的rpm包来下载安装..._route 命令不存在

IDEA中web项目maven项目打war包的方式_idea maven打war包-程序员宅基地

手动打包&maven工具打包方式详解1、打开idea,如图2、如图1.2.3步3、就出现一个新的,接下来配置一下4、点加号,选D… C…5、选择你项目得到webapp,点OK6、创建文件夹WEB-INF7、在WEB-INF里建classes8、选中classes,点加号,选M… O…9、选你的项目,点OK这时候的结构是这样的11、在WEB-INF下创建lib,放jar包..._idea maven打war包

【API设计】RESTful API 设计指南-程序员宅基地

RESTful APIURL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。例如1. REST描述的是在网络中client和server的一种交互形式;REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口);2. Server提供的RESTful API中,URL中只使用名词来指定资源,原则上不使用动词。...