總所周知摆马,百度地圖SDK是出了名的X拓提,他的隔壁鄰居高德簡直就是良心读恃。但是很多時(shí)候用哪個(gè)并不是我們自己能左右的。這不代态,新項(xiàng)目必須使用百度地圖(我:老板寺惫,能用高德嗎?老板:不能蹦疑。我:一萬只西雀。。你們懂)歉摧。算了艇肴,硬著上,在此做個(gè)總結(jié)以防后來人踩坑叁温,百度地圖不良心但是我有良心霸俚俊(機(jī)智)。
一膝但、android集成百度地圖(android百度地圖SDK系列)
二冲九、android百度地圖定位顯示當(dāng)前位置(android百度地圖SDK系列)
三、android百度地圖覆蓋物(android百度地圖SDK系列)
一跟束、申請密鑰
這里我就不羅里吧嗦的莺奸,相信你們都可以跟著百度地圖SDK搞定丑孩。
奉上地址:百度地圖SDK申請密鑰
二、配置環(huán)境
首先我們?nèi)ハ螺d需要的開發(fā)包灭贷,地址:百度地圖開發(fā)包下載
然后把jar包放入app目錄下libs文件夾里面温学,并且右鍵Add As Library。隨后在main目錄下新建一個(gè)jniLibs文件夾氧腰,把so文件放進(jìn)去枫浙。最后配置如下圖:
三、顯示地圖
1.經(jīng)過以上兩步古拴,地圖SDK最基本的工作已經(jīng)做完了箩帚,接下來就要對代碼進(jìn)行一些初始化編寫來顯示地圖。
首先在AndroidManifest.xml配置文件里進(jìn)行配置:
//添加開發(fā)密鑰
<application>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="開發(fā)者 key" />
</application>
//添加所需權(quán)限
<!--允許程序打開網(wǎng)絡(luò)套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允許程序設(shè)置內(nèi)置sd卡的寫權(quán)限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允許程序獲取網(wǎng)絡(luò)狀態(tài)-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允許程序訪問WiFi網(wǎng)絡(luò)信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允許程序讀寫手機(jī)狀態(tài)和身份-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--允許程序訪問CellID或WiFi熱點(diǎn)來獲取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--用于訪問GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--用于獲取wifi的獲取權(quán)限黄痪,wifi信息會(huì)用來進(jìn)行網(wǎng)絡(luò)定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于申請調(diào)用A-GPS模塊-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
<!--用于申請獲取藍(lán)牙信息進(jìn)行室內(nèi)定位-->
<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秒定位一次)是嗜,則需要多配置一個(gè)service。這也算是踩的一個(gè)坑挺尾,我做間隔定位的時(shí)候死活不行鹅搪,看遍了百度地圖api都沒有找到對應(yīng)的解決方法,最后搜了好久才解決了這個(gè)問題遭铺,再次鄙視百度地圖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 {
// 設(shè)置支持的SO庫架構(gòu)
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.新建一個(gè)全局的MyApplication類進(jìn)行初始化,并將其配置進(jìn)AndroidManifest.xml文件里:
SDKInitializer.initialize(getApplicationContext());
至此魂挂,所有的工作都已經(jīng)做完了甫题,我們來看看運(yùn)行效果:
到此為止一個(gè)最基本的百度地圖就顯示出來了,其它功能會(huì)在后續(xù)的文章中陸續(xù)寫出來涂召。最后為了防止有小白菜級(jí)別的同學(xué)坠非,我把所有代碼都貼出來↓
AndroidManifest.xml配置文件代碼
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.app.baidu">
<!--允許程序打開網(wǎng)絡(luò)套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允許程序設(shè)置內(nèi)置sd卡的寫權(quán)限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允許程序獲取網(wǎng)絡(luò)狀態(tài)-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允許程序訪問WiFi網(wǎng)絡(luò)信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允許程序讀寫手機(jī)狀態(tài)和身份-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--允許程序訪問CellID或WiFi熱點(diǎn)來獲取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--用于訪問GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--用于獲取wifi的獲取權(quán)限,wifi信息會(huì)用來進(jìn)行網(wǎng)絡(luò)定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于申請調(diào)用A-GPS模塊-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
<!--用于申請獲取藍(lán)牙信息進(jìn)行室內(nèi)定位-->
<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);
}
}