高仿百度地图中的离线地图下载

公司最近用到百度离线地图功能,特将以前用的百度离线功能抽离并整理出来,供大家用。可以作为一个model引入。先看效果
这里写图片描述

  • 首先配置百度地图的环境。
    1.将so文件和jar包放到libs文件中,并在gradle(app下的)中配置
sourceSets {
        main {
            jniLibs.srcDir 'libs'
        }

    }

配置这个的原因是.so文件默认不是放在libs路径下的。
2.创建一个application,初始化

package com.downofflinemap;

import android.app.Application;

import com.baidu.mapapi.SDKInitializer;

/**
 * Author:wang_sir
 * Time:2018/5/31 15:58
 * Description:This is MyApplication
 */
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext
        SDKInitializer.initialize(this);
    }
}

3.配置Androidmanifest.xml文件
首先将上面创建的application添加上

 <application
        android:name=".MyApplication"
        android:allowBackup="true"

然后配置key,如何获取key,官网上都有,很简单,这里就不说了。

<meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="M2Kwbs4xMaNnGx0gxxMqXbOQneYEF9pK" />

最后配置权限

<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <!-- 这个权限用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 这个权限用于访问GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 用于读取手机当前的状态 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 访问网络,网络定位需要上网 -->
    <uses-permission android:name="android.permission.INTERNET" />

地图环境配置完成后,就开始实现效果了

  • 代码实现效果
    布局主要用一个listView和ExpandableListView加载的内容。

首先是listView的初始化和item的长按时间监听

  /**
     * 初始化下载城市列表的listView和item点击事件
     */
    private void initDownloadedMapsView() {
        lAdapter = new DownloadedMapsAdapter(this,mOffline.getAllUpdateInfo(),this);
        downloadedMapsView.setAdapter(lAdapter);
        downloadedMapsView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View view, int arg2,
                                    long arg3) {
                MKOLUpdateElement bean = downloadedMaps.get(arg2);
                final int cityid = bean.cityID;
                TextView tv = (TextView) view.findViewById(R.id.citydelete_tv);

                if (bean.status == 1) {// 正在下载
                    mOffline.pause(cityid);
                    tv.setText("已暂停");

                } else if (bean.status == 2) {// 等待下载
                    mOffline.pause(cityid);
                    tv.setText("已暂停");
                } else if (bean.status == 3) {// 已暂停
                    mOffline.start(cityid);
                    tv.setText("暂停下载");
                }
                updateView();
                initBottomButtonBg();
            }
        });
        downloadedMapsView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                MKOLUpdateElement bean = downloadedMaps.get(position);
                final int cityid = bean.cityID;
                deleteOfflineMapDialog(cityid);
                return false;
            }
        });
    }

然后是ExpandableListView初始化和item点击事件的监听

 /**
     * 初始化CityExpandableListView的item点击事件
     */
    private void initCityExpandableListView(final ArrayList<MKOLSearchRecord> group,final ArrayList<List<MKOLSearchRecord>> child) {
        cityExpandAdapter = new CityExpandableAdapter(this, group, child,
                mOffline);
        cityExpandable_lv.setAdapter(cityExpandAdapter);
        cityExpandable_lv.setOnGroupClickListener(new OnGroupClickListener() {

            @SuppressLint("WrongConstant")
            @Override
            public boolean onGroupClick(ExpandableListView arg0, View view,
                                        int arg2, long arg3) {
                MKOLSearchRecord bean = group.get(arg2);
                if (bean.childCities == null) {
                    if (getDownloadingCitys() > 25) {
                        Log.i(Tag, "==-----" + getDownloadingCitys());
                        Toast.makeText(DownLoadOffLineMapActivity.this, "超过最大同时下载数", Toast.LENGTH_SHORT).show();
                        return true;
                    }
                    if (!getUpdatedCitys().contains(1)) {
                        mOffline.start(1);
                    }
                    int cityid = bean.cityID;
                    if (getUpdatedCitys().contains(cityid)) {
                        Toast.makeText(DownLoadOffLineMapActivity.this, "已添加到下载列表", 0)
                                .show();
                        switchToDownLoad();
                    } else {
                        mOffline.start(cityid);
                        Toast.makeText(DownLoadOffLineMapActivity.this, "已添加到下载任务", 0)
                                .show();
                    }

                    updateView();
                    cityExpandAdapter.notifyDataSetChanged();
                    return true;
                } else {
                    return false;// false 代表group展开
                }

            }
        });
        cityExpandable_lv.setOnChildClickListener(new OnChildClickListener() {

            @SuppressLint("WrongConstant")
            @Override
            public boolean onChildClick(ExpandableListView arg0, View view,
                                        int groupPosition, int childPosition, long arg4) {
                MKOLSearchRecord bean = child.get(groupPosition).get(
                        childPosition);
                int cityid = bean.cityID;
                if (!getUpdatedCitys().contains(1)) {
                    mOffline.start(1);
                }
                if (getUpdatedCitys().contains(cityid)) {

                    Toast.makeText(DownLoadOffLineMapActivity.this, "已添加到下载列表", 0)
                            .show();
                    switchToDownLoad();

                } else {
                    if (bean.cityType == 1) {
                        if (getDownloadingCitys() + bean.childCities.size() > 25) {
                            Log.i(Tag, "==-----" + getDownloadingCitys());
                            Toast.makeText(DownLoadOffLineMapActivity.this, "超过最大同时下载数", Toast.LENGTH_SHORT).show();
                            return true;
                        }
                    } else {
                        if (getDownloadingCitys() > 25) {
                            Log.i(Tag, "==-----" + getDownloadingCitys());
                            Toast.makeText(DownLoadOffLineMapActivity.this, "超过最大同时下载数", Toast.LENGTH_SHORT).show();
                            return true;
                        }
                    }
                    mOffline.start(cityid);
                    if (childPosition == 0) {
                        switchToDownLoad();
                    }
                    Toast.makeText(DownLoadOffLineMapActivity.this, "已添加到下载任务", 0)
                            .show();
                }
                updateView();
                cityExpandAdapter.notifyDataSetChanged();
                return false;
            }
        });
    }

注册一个动态广播,监听网络状态,断网时停止下载,网络恢复,开始下载

/**
 * 监听网络状态广播
 */
public class ConnectionChangeReceiver extends BroadcastReceiver {

    private NetStatusCallBack netStatusCallBack;

    public ConnectionChangeReceiver(NetStatusCallBack netStatusCallBack) {
        this.netStatusCallBack = netStatusCallBack;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

        if (!wifiNetInfo.isConnected()) {//网络断开时,将所有任务暂停
            if (netStatusCallBack != null) {
                netStatusCallBack.networkShutDown();
            }

        } else {//网络恢复后,开始所有未完成任务
            if (netStatusCallBack != null) {
                netStatusCallBack.networkRecovery();
            }

        }
    }
}

感觉也没啥了,功能很简单,没什么要说的,大家可以做个参考。

代码已上传到GitHub:https://github.com/DevelopWb/BaiduOfflineMap

猜你喜欢

转载自blog.csdn.net/csdn_mm/article/details/80540709
今日推荐