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

智能推荐

php mcrypt 初解-程序员宅基地

在某位大师的指导要求下,刚把今天代码做ending的我,来看一下mcrypt,安装就不说了,extension=php_mcrypt.dll加密算法Mcrypt支持的算法有:cast-128,gost,rijndael-128,twofish,arcfour,cast-256,loki97,rijndael-192,saferplus,wake,blowfish-compat,..._php mcrypt详解

[UE4]Canvas Panel和Uniform Grid Panel的区别(UMG Widget)-程序员宅基地

打开Widget蓝图,在Palette(画板)面板中,可以选择Widget最外层的Panel类型,默认已经帮你建了一个Canvas Panel,看了下文档:https://docs.unrealengine.com/latest/INT/Engine/UMG/UserGuide/WidgetTypeReference/index.html 这个Canvas Panel内部不适合通过...

ubuntu怎么设置系统语言英文_win7系统怎么设置windows防火墙_李三点儿的博客-程序员宅基地

最近有位win7系统用户反映,因为电脑没有设置windows防火墙,导致了电脑经常中病毒,所以想要重新设置windows防火墙,但是有不知道怎么操作,那么win7系统怎么设置windows防火墙呢?今天为大家带来win7系统设置windows防火墙的操作方法。设置windows防火墙操作方法:1、在“开始”中点击“控制面板”;如图所示:2、打开第一项“系统和安全”,点击“检查防火墙状态”,会弹出了..._win防火墙切换语音

大虫说她被忽悠了-程序员宅基地

今天早上一来,大虫就说她的手机居然停机了。我说:“不得哟,前2天都还有20的余额得嘛!”。我立马把传说中的街机诺基亚拿来瞅瞅,结果经过一番折腾,原来是GPRS流量超标,哗啦啦的30几元RMB就不在了。嘿嘿,这个都是要拜我们天朝移动给赐予的吖!超标了还能用,就不告诉你,就不告诉你,就不告诉你。哎,神奇的大虫还在那发火老。转载于:https://www.cnblogs.co...

计算机维修理论知识试卷,高级计算机维修工理论知识考核试卷_分秒帧的博客-程序员宅基地

高级计算机维修工理论知识考核试卷线高级计算机维修工理论知识考核试卷此注 意 事 项1、本试卷依据2007年颁布的《计算机(微机)维修工》国家职业标准命制, 考试时间:90分钟。过2、请在试卷标封处填写姓名、准考证号和所在单位的名称。 3、请仔细阅读答题要求,在规定位置填写答案。超准 不一、单项选择题(第1题~第80题。选择一个正确的答案,将相应的字母填入题内的括号中。每题1分,满..._计算机维修工高级考试题

flex布局给文字加省略号-程序员宅基地

word-break: break-all; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 1; overflow: hidden;错误做法:

随便推点

RabbitMQ和kafka的区别_rabbitmq 和kafka-程序员宅基地

1.应用场景方面RabbitMQ:用于实时的,对可靠性要求较高的消息传递上。kafka:用于处于活跃的流式数据,大数据量的数据处理上。2.架构模型方面producer,broker,consumerRabbitMQ:以broker为中心,有消息的确认机制kafka:以consumer为中心,无消息的确认机制3.吞吐量方面RabbitMQ:支持消息的可靠的传递,支持事务,不支持批量操..._rabbitmq 和kafka

测试人员可以在Appsec中提供多少帮助?-程序员宅基地

目前尚不清楚QA可以或应该在Application Security程序中扮演多少角色(在大多数组织中,QA意味着进行手动功能测试或编写自动功能验收测试的黑盒测试人员)。 对安全性(而非开发人员)的质量检查进行培训 在RSA 2011大会上,Caleb Sima断言, 在Appsec中培训开发人员主要是浪费时间 (“ 不要教开发人员安全性 ”)。 因为大多数开发人员不会得到它; 即使..._appsec测试

solidworks新建工程图默认单位为毫米_sw2023单位一直是英寸-程序员宅基地

问题:在solidworks里面新建工程图的时候,默认单位老是英寸,在选项-文档属性-单位里调整了也不行原因:这个单位不只针对于solidworks软件设置的,如果是针对软件的话,那就是设置之后就整个软件全部变成毫米单位,但是还是英寸。后来得知这个单位是这个模板的单位,也就是说把这个模板单位改成毫米,然后保存成工程图模板,再把默认工程图模板改成刚刚保存好的,那么以后新建工程图的时候,就是这个模板,单位就变成了毫米了。解决办法:在模板这里改成毫米:另存模板:..._sw2023单位一直是英寸

【GDOI2017模拟9.21】妮厨的愤怒_4793. 【gdoi2017模拟9.21】妮厨的愤怒-程序员宅基地

题目大意:给出一个长度为n的字符串S,Q个询问,每次给出l,r,求S的第l位到第r位的最长回文子串。 (1<=n,Q<=10^5)题解:记得以前做过一道很像的题。 是YJL的题,二维RMQ,对于每一个查询也是二分答案。不说了,首先添加特殊字符,manacher求出r。 对于每一个询问,二分答案,于是我们得到了可能的回文中心的范围,RMQ查询区间最大值,判一下即可。Code:#include

使用cubemx 生成Usmart调试神器,以STM32F103RE为例_看电路的程序猿的博客-程序员宅基地

1.USMART是什么?使用USMART,你可以轻易的修改函数参数、查看函数运行结果,从而快速解决问题。比如你调试一个摄像头模块,需要修改其中的几个参数来得到最佳的效果,普通的做法:写函数→修改参数→下载→看结果→不满意→修改参数→下载→看结果→不满意….不停的循环,直到满意为止。这样做很麻烦不说,单片机也是有寿命的,老这样不停的刷,很折寿的。而利用USMART,则只需要在串口调试助手里面输入函数全称以及参数,然后直接使用串口发送给单片机,就执行了一次参数调整,不满意的话,你在串口调试助手修改参数再发