您好,登錄后才能下訂單哦!
本篇主要是因為最近在學習使用百度地圖,發現了一些問題,跟大伙分享一下。
1、根據android sdk開發指南中“Hello World”的例子,構建一個基礎的地圖頁面,如果大家完全按照示例代碼中所寫的那樣,是不會執行成功的,會有以下問題的錯誤提示“java.lang.RuntimeException: Unable to instantiate activity ComponentInfo”
這個問題出現的原因是
在第二步,配置Activity部分,android:name的值為.MapDemo,而在第四步,創建地圖Activity處,創建的Activity繼承類名寫的卻是MyMapActivity。如果你想讓在AndroidManifest.xml中配置Activity時的.MapDemo為起始的Activity,除了要在<Activity></Activity>之間加上以下這段代碼之外
<intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter>
還要把android:name的.MapDemo改成你當前項目的“包名+MyMapActivity”或者直接寫“MyMapActivity”,這樣再執行就會構建出一個基礎的百度地圖。
這個問題其實也是一個Android開發的基礎問題,也算是對我這個Android半吊子一個知識點的鞏固。下面針對這個問題的出現回顧以下知識點:
(1)AndroidManifest.xml作為項目的布局文件,時時刻刻把握整個項目命脈,項目啟動時,要設置啟動項,權限不夠時,要加相應的權限設置。
(2)在AndroidManifest.xml中配置的Activity如何與src中的.java文件聯系在一起呢?就是依靠配置的該Activity中的android:name的值要完全與.java文件中的類名一致。
(3)而“后臺”的.java文件又是如何與“前臺”的res/layout中的activity布局文件聯系在一起的呢(請允許我用前后臺這樣的非專業術語來說,因為自己主做web開發,這樣說感覺比較形象)?就是通過.java文件中,繼承Activity類的新類的OnCreate方法中
setContentView(R.layout.activity_main)
這樣的一條語句搞定的,這里的activity_main即是布局文件的名字而已。
由以上的幾條我們會發現Android開發中,主要的兩個東西都是靠名稱去匹配的,所以我們在開發中一定要在這方面多多注意,至于是不是其他的東西也是依賴名稱去匹配,就需要我們去不斷在開發中發現。
2、說的第二個問題是關于坐標的,在百度地圖給出的源碼中,我們會發現類似這樣的語句
GeoPoint point =new GeoPoint((int)(39.915* 1E6),(int)(116.404* 1E6));
翻譯一下就是創建一個GeoPoint類型的緯度為39.915度,經度為116.404度的坐標點,為什么要*1E6,是為了把傳入的經度,緯度轉換成微度,就是在原基礎上乘以10的-6次冪。至于GeoPoint中到底是什么樣,那都是百度封裝好的,所以我也懶著去關心了,大家知道跟坐標點有關就行了。
不過這里容易出現一個小問題,就是我們習慣性的會認為寫坐標點的時候是這種格式“經度,緯度”,而這個方法的構造函數完全是相反的。當然,這不算什么,但是問題就出在,在百度地圖官方給出的“拾取坐標系統”工具(鏈接:http://api.map.baidu.com/lbsapi/getpoint/index.html,這個東東還是很實用的,如果我們做地圖開發沒有它,那就沒戲啦,它主要就是坐標-地址的查詢工具)中,使用的坐標點形式就是“經度,緯度”,有點把我們帶偏的感覺。所以容易搞錯,這塊要注意一下,否則坐標都在十萬八千里之外了。
PS:經度(longitude),緯度(latitude)
3、關于定位SDK的,這個問題真心的很坑人。下午耗了幾個小時,真不爽。
雖然標題說的是android sdk,
在百度地圖官方定位SDK處可謂是非常詳細,把如何構建基礎定位功能的步驟已經詳細給我們列出,但這里有個小瑕疵我不得不說,達到了令人發指的地步。
先來簡單回顧一下百度地圖官方給出的東東
在V4.1版本的第3點,功能類的使用,3.1.1初始化LocationClient類 小節
public LocationClient mLocationClient = null; public BDLocationListener myListener = new MyLocationListener(); publicvoid onCreate() { mLocationClient = new LocationClient(getApplicationContext()); //聲明LocationClient類 mLocationClient.registerLocationListener( myListener ); //注冊監聽函數 }
3.1.3設置定位參數 小節
LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationMode.Hight_Accuracy);//設置定位模式 option.setCoorType("bd09ll");//返回的定位結果是百度經緯度,默認值gcj02 option.setScanType(5000);//設置發起定位請求的間隔時間為5000ms option.setIsNeedAddress(true);//返回的定位結果包含地址信息 option.setNeedDeviceDirect(true);//返回的定位結果包含手機機頭的方向 mLocClient.setLocOption(option);
對了這處的第4行setScanType方法請改寫成setScanSpan。之所以寫錯可能是先前版本的成員方法名,在這個版本中已經不再存在。
3.1.4發起定位請求 小節
if (mLocClient != null && mLocClient.isStarted()) mLocClient.requestLocation(); else Log.d("LocSDK3", "locClient is null or not started");
乍一看條理非常的清晰,先聲明類,綁定方法,如果有特殊要求,再加個option的設置,最后驗證對象是否為空,不為空就執行最終的請求定位,多完美啊!~
但是如果我們就這樣執行了,那么就會發現log中一直出現“locClient is null or not started”這句話,我試了N多遍,都有了想吐血的沖動(請原諒我的吐槽),最后通過對定位sdk的sample一行一行去找才發現了問題(之所以一行一行的找,是因為把項目導入本地工程之后,各種紅,運行不了),原因就在于,在對LocationClient類實例調用requestLocation()方法之前,一定要調用一下start()方法,像這樣:
mLocationClient.start();
哦~~那是什么?對的,開發指南中并沒有寫出來。應該是一個使LocationClient實例啟動的方法,所以后面if條件句中的isStarted()我們也就明白是怎么回事了。
4、接著說一下如何成功在本地運行Android SDK給出的“BaiduMap_AndroidSDK_v2.4.1_Sample”示例,這是官方的一個Demo,為我們展示了在Android SDK下的各個功能模塊。
如果大家細心讀了百度地圖的使用規則,就知道如果我們想使用百度地圖API,就必須申請對應的KEY,而申請KEY的關鍵,我總結的話就是在安全碼上,下面只說Android SDK安全碼組成:數字簽名+;+包名。
其實這部分百度地圖申請KEY的《查看詳細配置方法》里已經詳細說明。我只是想說這里的包名,要寫成我們下載下來的示例包名:baidumapsdk.demo。
這塊可能對大多數朋友來說順理成章,我之所以說一下是因為第一次申請KEY,而且是先創建了一個本地項目,又沒有直接去運行Sample,所以當時就有點懵,誤把針對自己項目的KEY當成可以在Sample上使用的KEY。
這塊大家沒遇到這個問題就從腦子里抹去吧。
隨著一步步的探索,慢慢的就能跟隨自己的想法來使用百度地圖去設計一些小功能了,之后也遇到了一些問題,不過感覺解決的都很快,這里就不一一詳述了,都是些小問題。如果大家遇到其他Android SDK上的問題比較頭大,我們可以交流一下。
另外,這幾天通過對百度地圖API的學習,也看到了差距,自己還是要不斷的去學習,提升自己,向度娘看齊。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。