公司最近用到百度离线地图功能,特将以前用的百度离线功能抽离并整理出来,供大家用。可以作为一个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