参考学习:
百度地图官网:
androidsdk/guide/basicmap - Wiki http://lbsyun.baidu.com/index.php?title=androidsdk/guide/basicmap
很有学习价值!!!
Small_Cake的专栏里对于百度地图的使用做了很详细的介绍
1.深入学习百度地图Android SDK v4.0.0【第一关】基础地图 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52193921
2.深入学习百度地图Android SDK v4.0.0【第二关】公交地图 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52199135
3.深入学习百度地图Android SDK v4.0.0【第三关】路线规划 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52212402
4.深入学习百度地图Android SDK v4.0.0【第四关】OpenGL绘制 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52336116
5.深入学习百度地图Android SDK v4.0.0【第五关】瓦片图层 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52370635
6.深入学习百度地图Android SDK v4.0.0【第六关】室内地图 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52370729
7.深入学习百度地图Android SDK v4.0.0【第七关】周边雷达 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52412099
注意事项:
1.libs文件夹放入jar包,在main里新建的jniLibs文件夹放入.so文件
2.当开发完进行打包apk时i,安装apk在手机上后,之前是会显示地图的,但现在却不显示地图了,只显示网格,这就说明是百度地图的Key有问题了。开发和打包apk对应的key是不一样的,详情请看:在android studio直接运行时百度地图显示,真机打包apk时地图不显示的问题
接入百度地图SDK:
准备:
1.请好好看看:百度地图官网开发指南
2.在控制台创建应用:获取自己电脑Debug模式下的SHA1值(这个只能是此电脑的开发模式下的使用,所以换个电脑或打包apk都不能正常显示地图,必须换成对应的SHA1,则就必须重新在控制台新建应用,输入对应的SHA1值啦)
3.下载SDKSDK下载 - 百度LBS开放平台 http://lbsyun.baidu.com/index.php?title=sdk/download&action#selected=mapsdk_basicmap,mapsdk_searchfunction,mapsdk_lbscloudsearch,mapsdk_calculationtool,mapsdk_radar
Androidstudio配置:
1.把你下载下来的sdk(文件夹的libs中的)全部拷贝到你app的libs中,比如这样
2.app的gradle:
android{
sourceSets{
main{
jniLibs.srcDir 'libs'
//说明so的路径为该libs路径,关联所有地图SDK的so文件
}
}
}
dependencies{
implementation files('libs/BaiduLBS_Android.jar') 引进你所有的jar包
}
3.权限:
记得在程序中要动态申请定位权限才能实现定位等功能哦!
<manifest>
<!-- 百度地图需要的权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_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"/>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_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" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<application
<activity android:name=".MainActivity">
</activity>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="你的key" />
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"/>
</application>
</manifest>
具体代码:
BaseApplication:
public class BaseApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
SDKInitializer.initialize(this);
}
}
把每一个功能都独立出来了,一个大功能一个界面。
1.公交线路搜索:
1.布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#FFFFFF"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/ed_start_bus_station"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入城市名称"/>
<EditText
android:id="@+id/ed_end_bus_station"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入公交路线号"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_choose_bus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="搜索公交路线"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:gravity="center"
android:layout_weight="1"
android:textSize="21sp"/>
<TextView
android:id="@+id/tv_previous"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上一个"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:gravity="center"
android:layout_weight="1"
android:textSize="21sp"/>
<TextView
android:id="@+id/tv_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下一个"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:gravity="center"
android:layout_weight="1"
android:textSize="21sp"/>
</LinearLayout>
<com.baidu.mapapi.map.MapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
android:clickable="true" />
</LinearLayout>
2.activity代码:
/**
* 公交路线:
* 根据城市名称、公交路线号,搜索公交路线
*/
public class ActBusLineMap extends AppCompatActivity
implements OnGetBusLineSearchResultListener, OnGetPoiSearchResultListener {
@BindView(R.id.map_view)
MapView mapView;
@BindView(R.id.ed_start_bus_station)
EditText edStartBusStation;
@BindView(R.id.ed_end_bus_station)
EditText edEndBusStation;
@BindView(R.id.tv_choose_bus)
TextView tvChooseBus;
@BindView(R.id.tv_previous)
TextView tvPrevious;
@BindView(R.id.tv_next)
TextView tvNext;
private BaiduMap mBaiduMap;
private PoiSearch poiSearch;
private BusLineSearch busLineSearch;
private List<String> busLines = new ArrayList<>();
private int uidPostion = 0;//当前选中第几条路线
private BusLineResult mBusLineResult;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_buslinemap);
ButterKnife.bind(this);
mBaiduMap = mapView.getMap();
init();
onEvent();
}
/**
* 点击事件
* @param view
*/
@OnClick({R.id.tv_choose_bus, R.id.tv_previous, R.id.tv_next})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.tv_choose_bus:
poiSearch.searchInCity(
new PoiCitySearchOption().city(
edStartBusStation.getText().toString()).keyword(edEndBusStation.getText().toString()));
break;
case R.id.tv_previous:
if (uidPostion>0){
uidPostion--;
searchBusLine();
}
break;
case R.id.tv_next:
if (uidPostion<(busLines.size()-1)){
uidPostion++;
searchBusLine();
}
break;
}
}
private void onEvent() {
}
public void init() {
//检索查询初始化并监听
poiSearch = PoiSearch.newInstance();
poiSearch.setOnGetPoiSearchResultListener(this);
//路线查询初始化并监听
busLineSearch = BusLineSearch.newInstance();
busLineSearch.setOnGetBusLineSearchResultListener(this);
//公交路线覆盖物,并设置路线的点击事件
overlay = new BusLineOverlay(mBaiduMap){
@Override
public boolean onBusStationClick(int index) {
if (mBusLineResult.getStations() != null
&& mBusLineResult.getStations().get(index) != null) {
showToast( mBusLineResult.getStations().get(index).getTitle() );
}
return true;
};
};
mBaiduMap.setOnMarkerClickListener(overlay);
}
/**
* 【1】首先检索查询
*
* @param poiResult
*/
@Override
public void onGetPoiResult(PoiResult poiResult) {
if (poiResult == null || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
showToast("抱歉,未找到结果" );
return;
}
if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {
busLines.clear();
List<PoiInfo> allPoi = poiResult.getAllPoi();
if (allPoi == null || allPoi.size() == 0) return;