這次跟各位分享一個(gè)地圖的SDK。先說(shuō)說(shuō)為什么拿Mapbox來(lái)用吧。
首先就是——國(guó)際化。當(dāng)需求要顯示國(guó)外的地理位置信息的時(shí)候,通常使用的是Google Map。但是Google Map目前需要手機(jī)帶有完整的Google Play套件才行,但是基本上所有的國(guó)內(nèi)上市的手機(jī)都把Google Play套件閹割了。然后就是偏移量,從目前來(lái)看,Mapbox的路網(wǎng)和衛(wèi)星照片是重合的,而Google Map則是有一定的偏移,尤其是在中國(guó)。最后呢,Mapbox的集成方式實(shí)在是太簡(jiǎn)單了。不過(guò)呢,說(shuō)了這么多優(yōu)點(diǎn),再說(shuō)一個(gè)缺點(diǎn)。就是Mapbox的衛(wèi)星照片略慢,尤其是中國(guó),某些地方還停留在幾年前的樣子,這個(gè)以年為單位,一點(diǎn)都不夸張。
如果你需要做海外的地圖定位,個(gè)人認(rèn)為,Mapbox可作為首選。
下面說(shuō)一下具體的集成方法。
首先,需要去官網(wǎng)注冊(cè)一個(gè)賬號(hào),這里附上官網(wǎng)地址鏈接:
https://www.mapbox.com/
注冊(cè)完成后,進(jìn)入網(wǎng)頁(yè)Studio界面,我們會(huì)輕松找到Access Token。我們后面會(huì)用到。
然后新建一個(gè)Android項(xiàng)目,這里推薦targetAPI<23,但是必須大于15。
在app目錄下的build.gradle文件中添加下面的內(nèi)容,用來(lái)導(dǎo)入依賴庫(kù)。
repositories{mavenCentral()}
compile('com.mapbox.mapboxsdk:mapbox-android-sdk:4.2.0@aar') {
transitive = true
}
這里注意版本,雖然復(fù)制粘貼過(guò)去沒(méi)有問(wèn)題,但是依賴庫(kù)的版本還在不斷更新,也許下一秒就發(fā)布4.2.1或者其他什么版本,所以這個(gè)還是有必要直接去官網(wǎng)上看一下。網(wǎng)址在此:
https://www.mapbox.com/android-sdk/
下一步我們?cè)诓季治募刑砑拥貓D控件,很簡(jiǎn)單,最簡(jiǎn)易的寫法可以像下面這樣:
<com.mapbox.mapboxsdk.maps.MapView
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
當(dāng)然,我們需要顯示一個(gè)自己比較熟悉的位置,而且還要能夠看得足夠清晰,可以寫成像下面這樣:
<com.mapbox.mapboxsdk.maps.MapView
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
mapbox:center_latitude="39.069"
mapbox:center_longitude="117.221"
mapbox:style_url="@string/style_satellite_streets"
mapbox:zoom="15" />
這里提醒一下,在xml最上方加上命名空間,否則會(huì)報(bào)錯(cuò):
xmlns:mapbox="http://schemas.android.com/apk/res-auto"
這樣做,可以同時(shí)顯示路網(wǎng)和衛(wèi)星照片,雖然衛(wèi)星照片可能比較過(guò)時(shí),但是確實(shí)很清楚。而且可以稍微移動(dòng)一下,看看國(guó)外的風(fēng)景,情況就大不一樣了。
下一步需要在Activity中完成初始化等操作,在onCreate()方法中添加如下代碼:
setContentView(R.layout.activity_main);
MapboxAccountManager.start(this, getString(R.string.access_token));
mv = (MapView) findViewById(R.id.mapview);
mv.onCreate(savedInstanceState);
mv.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(MapboxMap mapboxMap) {
}
});
當(dāng)然,這只是個(gè)例子。
這里要注意的就是必須在Activity中的各個(gè)生命周期中添加相應(yīng)的方法,比如onResume()中,需要加上:
mv.onResume();
其他生命周期回調(diào)類似。
最后在AndroidManifest.xml中做好相關(guān)權(quán)限聲明:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
還有一個(gè)Service:
<service android:name="com.mapbox.mapboxsdk.telemetry.TelemetryService" />
該Service在Application節(jié)點(diǎn)內(nèi)。
好了,運(yùn)行一下吧,一切順利的話就可以看到地圖的顯示了。
下面附上完整的項(xiàng)目源碼:
https://github.com/XiaoWenHan/MapboxAndroidDemo