現今許多 Android 應用程式都需要某種形式的互動式地圖作為使用者介面的一部分。Google 通過 Google Play 服務提供原生套件和體驗來滿足此需求,但問題仍然存在,如何在沒有 Play 服務的裝置上建立互動式地圖?
在某些國家/地區,大多數裝置的銷售都沒有搭載 Google Play 服務。沒有搭載 Play 服務的裝置製造商在全球範圍內持續獲得歡迎。為了讓我們的應用程式提供真正的國際化體驗,我們不能遺漏像地圖這樣重要的功能。而且,由於我們知道其他公司也有同樣的問題,因此我們建立並開源了 AirMapView。
AirMapView 是一個視圖抽象化,可在搭載和未搭載 Google Play 服務的裝置上啟用互動式地圖。搭載 Google Play 服務的裝置將使用 Google Maps V2,而沒有搭載的裝置將使用基於網頁的 Google Maps 實作。這一切都來自一個單一的 API,該 API 的設計與大多數開發人員熟悉的 Google Maps V2 相似。
AirMapView 預設會選擇該裝置可用的最佳地圖供應商。如果有的話,預設會使用原生 Google Maps V2,如果 Google Play 服務不可用,則會退回到 WebView 解決方案。該 API 的設計對使用者完全透明,因此開發人員可以使用目前用於 Google Maps 的相同 API 來獲得回退功能。
原生 GoogleMap 作為一個 Fragment 實作在 AirMapView 內部,提供與直接使用 Google Maps V2 完全相同的功能。將現有的 GoogleMap 實作移植到 AirMapView 非常簡單,只需將對 GoogleMap 的呼叫替換為對 AirMapView 的呼叫,並為 OnCameraChanged 等操作實作正確的回呼類別。該 API 的設計具有可插拔性,因此開發人員可以為特定裝置(例如 Amazon Kindle Fire 裝置的 Amazon Maps)添加自己的供應商。
回退的 webview 地圖會在 Android WebView 內部顯示 Google Map,並使用 Javascript Bridge 回呼來允許與地圖進行動態互動。由於它是 webview 而不是原生程式碼,因此它的效能不如原生 GoogleMap,但在 Airbnb 應用程式中的實驗中,它的效能僅略遜一籌。
使用 Javascript Bridge,我們可以在網頁地圖中實作相同的 API,因此一旦為原生地圖實作了 AirMapView,就無需變更任何用戶端程式碼來支援網頁地圖。
網頁地圖允許設定位置、置中、新增標記、拖曳、點擊地圖以及 GoogleMap 目前支援的其他常見操作。
我們建構 AirMapView 的方式,使我們能夠在未來輕鬆添加其他地圖供應商,例如 Amazon Maps V2、百度、Mapbox 等。