总所周知,百度地图SDK是出了名的X,他的隔壁邻居高德简直就是良心。但是很多时候用哪个并不是我们自己能左右的。这不,新项目必须使用百度地图(我:老板,能用高德吗?老板:不能。我:一万只。。你们懂)。算了,硬着上,在此做个总结以防后来人踩坑,百度地图不良心但是我有良心啊(机智)。
一、android集成百度地图(android百度地图SDK系列)
二、android百度地图定位显示当前位置(android百度地图SDK系列)
三、android百度地图覆盖物(android百度地图SDK系列)
一、申请密钥
这里我就不罗里吧嗦的,相信你们都可以跟着百度地图SDK搞定。
奉上地址:百度地图SDK申请密钥
二、配置环境
首先我们去下载需要的开发包,地址:百度地图开发包下载
然后把jar包放入app目录下libs文件夹里面,并且右键Add As Library。随后在main目录下新建一个jniLibs文件夹,把so文件放进去。最后配置如下图:
三、显示地图
1.经过以上两步,地图SDK最基本的工作已经做完了,接下来就要对代码进行一些初始化编写来显示地图。
首先在AndroidManifest.xml配置文件里进行配置:
//添加开发密钥
<application>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="开发者 key" />
</application>
//添加所需权限
<!--允许程序打开网络套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许程序设置内置sd卡的写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允许程序获取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允许程序访问WiFi网络信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允许程序读写手机状态和身份-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
<!--用于申请获取蓝牙信息进行室内定位-->
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
以上,对于AndroidManifest.xml的配置就完成了,但是值得注意的是,如果需要用到间隔定位功能(每隔n秒定位一次),则需要多配置一个service。这也算是踩的一个坑,我做间隔定位的时候死活不行,看遍了百度地图api都没有找到对应的解决方法,最后搜了好久才解决了这个问题,再次鄙视百度地图api。service配置如下:
<!-- 百度地图 间隔定位必须配置此service否则功能无效-->
<service android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"/>
由于我的so文件是用了arm64-v8a,armeabi-v7a,x86所以在build.gradle里额外配置一句:
ndk {
// 设置支持的SO库架构
abiFilters 'arm64-v8a','armeabi-v7a','x86'
}
2.在我们的布局文件里面添加百度地图控件:
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
3.新建一个全局的MyApplication类进行初始化,并将其配置进AndroidManifest.xml文件里:
SDKInitializer.initialize(getApplicationContext());
至此,所有的工作都已经做完了,我们来看看运行效果:
到此为止一个最基本的百度地图就显示出来了,其它功能会在后续的文章中陆续写出来。最后为了防止有小白菜级别的同学,我把所有代码都贴出来↓
AndroidManifest.xml配置文件代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.app.baidu">
<!--允许程序打开网络套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许程序设置内置sd卡的写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允许程序获取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允许程序访问WiFi网络信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允许程序读写手机状态和身份-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
<!--用于申请获取蓝牙信息进行室内定位-->
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<application
android:name=".application.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- 百度地图 -->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="tmt2PZ01MZqzMDBmEIwi56R4RgvG596o" />
<activity android:name=".ui.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 百度地图 间隔定位必须配置此service否则功能无效-->
<service android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"/>
</application>
</manifest>
布局文件代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
MyApplication类代码:
public class MyApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
//百度地图SDK的全局初始化
SDKInitializer.initialize(getApplicationContext());
}
}
MainActivity类代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}