配置baidumap 環(huán)境
1.在百度api中新建自己的一個(gè)app包名和app名需要注意和自己android studio 中的包名和app名保持一致;
2.百度地圖中還需要填寫(xiě)一個(gè)sha1 數(shù)字簽名:
a、輸入keytool -list -v -keystore debug.keystore,會(huì)得到三種指紋證書(shū),選取sha1類型的證書(shū)(密鑰口令是android),這個(gè)獲取到的sha1的值和ecplise中獲取的值是一樣的,是作為debug用的。
b、輸入keytool -list -v -keystore xxx.keystore,(這個(gè)地方xxx.keystore是你生成app簽名時(shí)的keystore),密鑰庫(kù)口令:為給app簽名時(shí)生成xxx.keystore期間所輸入的密碼,此時(shí)獲取的sha1是release版的。
(以上主要是為了得到appkey,沒(méi)有appkey讀取的值會(huì)有問(wèn)題)
3.根據(jù)需要在(http://lbsyun.baidu.com/sdk/download?selected=location)下載自己需要的sdk包,因?yàn)橹粚?shí)現(xiàn)定位所以我這里只下載了定位功能的包;
4.解壓下載好的包,為了讓app兼容性更好,我把libs下的所有文件及文件夾復(fù)制到了app中l(wèi)ibs中;
5.配置manifest文件,首先在application中添加你獲得的appkey:
1
2
3
|
<meta-data android:name= "com.baidu.lbsapi.api_key" android:value= "這里是你申請(qǐng)的appkey" /> |
然后緊接著需要注冊(cè)一個(gè)專門(mén)供baidumap使用的service(自己不用實(shí)現(xiàn)):
1
2
3
4
|
<service android:name= "com.baidu.location.f" android:enabled= "true" android:process= ":remote" /> |
最后再配置權(quán)限,定位所需要用到的一系列權(quán)限(這一塊在官方文檔上也是有的):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<!-- 這個(gè)權(quán)限用于進(jìn)行網(wǎng)絡(luò)定位--> <uses-permission android:name= "android.permission.access_coarse_location" /> <!-- 這個(gè)權(quán)限用于訪問(wèn)gps定位--> <uses-permission android:name= "android.permission.access_fine_location" /> <!-- 用于訪問(wèn)wifi網(wǎng)絡(luò)信息,wifi信息會(huì)用于進(jìn)行網(wǎng)絡(luò)定位--> <uses-permission android:name= "android.permission.access_wifi_state" /> <!-- 獲取運(yùn)營(yíng)商信息,用于支持提供運(yùn)營(yíng)商信息相關(guān)的接口--> <uses-permission android:name= "android.permission.access_network_state" /> <!-- 這個(gè)權(quán)限用于獲取wifi的獲取權(quán)限,wifi信息會(huì)用來(lái)進(jìn)行網(wǎng)絡(luò)定位--> <uses-permission android:name= "android.permission.change_wifi_state" /> <!-- 用于讀取手機(jī)當(dāng)前的狀態(tài)--> <uses-permission android:name= "android.permission.read_phone_state" /> <!-- 寫(xiě)入擴(kuò)展存儲(chǔ),向擴(kuò)展卡寫(xiě)入數(shù)據(jù),用于寫(xiě)入離線定位數(shù)據(jù)--> <uses-permission android:name= "android.permission.write_external_storage" /> <!-- 訪問(wèn)網(wǎng)絡(luò),網(wǎng)絡(luò)定位需要上網(wǎng)--> <uses-permission android:name= "android.permission.internet" /> <!-- sd卡讀取權(quán)限,用戶寫(xiě)入離線定位數(shù)據(jù)--> <uses-permission android:name= "android.permission.mount_unmount_filesystems" /> |
至此環(huán)境配置完成。
實(shí)現(xiàn)功能代碼
1.在layout寫(xiě)一個(gè)textview用來(lái)存放自己定位的信息:
1
2
3
4
5
|
<textview android:id= "@+id/mytext" android:layout_width= "match_parent" android:layout_height= "wrap_content" /> |
2.在定位中需要用到一個(gè)定位回調(diào)接口bdlocationlistener和類locationclient:
① bdlocationlistener中一個(gè)定位回調(diào)函數(shù)onreceivelocation(bdlocation location)返回一個(gè)bdlocation定位結(jié)果;
② locationclient類實(shí)例化并實(shí)現(xiàn)一個(gè)定位監(jiān)聽(tīng)函數(shù)(registerlocationlistener(bdlocationlistener listener));
定義textview控件和其他方法類:
1
2
3
4
|
private textview textview = null ; private button button = null ; private locationclient locationclient = null ; public bdlocationlistener mylistener = new mybdlocationlistener(); |
實(shí)現(xiàn)bdlocationlistener(里面的一些判斷可以自己去考慮和添加或者需要什么定位信息自行去嘗試,這里只是得到了當(dāng)前地址):
1
2
3
4
|
public class mybdlocationlistener implements bdlocationlistener{ @override public void onreceivelocation(bdlocation location) { textview.settext(location.getaddrstr()); } } |
分別得到所有控件和實(shí)例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
textview = (textview) findviewbyid(r.id.mytext); button = (button) findviewbyid(r.id.mybtn); locationclient = new locationclient(getapplicationcontext()); locationclient.registerlocationlistener(mylistener); initlocation(); //初始化locationgclient button.setonclicklistener( new view.onclicklistener() { @override public void onclick(view view) { if (locationclient.isstarted()){ locationclient.stop(); } locationclient.start(); } }); |
初始化locationgclient:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
private void initlocation(){ locationclientoption option = new locationclientoption(); option.setlocationmode(locationclientoption.locationmode.hight_accuracy ); //可選,默認(rèn)高精度,設(shè)置定位模式,高精度,低功耗,僅設(shè)備 option.setcoortype( "bd09ll" ); //可選,默認(rèn)gcj02,設(shè)置返回的定位結(jié)果坐標(biāo)系 int span= 1000 ; option.setscanspan(span); //可選,默認(rèn)0,即僅定位一次,設(shè)置發(fā)起定位請(qǐng)求的間隔需要大于等于1000ms才是有效的 option.setisneedaddress( true ); //可選,設(shè)置是否需要地址信息,默認(rèn)不需要 option.setopengps( true ); //可選,默認(rèn)false,設(shè)置是否使用gps option.setlocationnotify( true ); //可選,默認(rèn)false,設(shè)置是否當(dāng)gps有效時(shí)按照1s1次頻率輸出gps結(jié)果 option.setisneedlocationdescribe( true ); //可選,默認(rèn)false,設(shè)置是否需要位置語(yǔ)義化結(jié)果,可以在bdlocation.getlocationdescribe里得到,結(jié)果類似于“在北京天安門(mén)附近” option.setisneedlocationpoilist( true ); //可選,默認(rèn)false,設(shè)置是否需要poi結(jié)果,可以在bdlocation.getpoilist里得到 option.setignorekillprocess( false ); //可選,默認(rèn)true,定位sdk內(nèi)部是一個(gè)service,并放到了獨(dú)立進(jìn)程,設(shè)置是否在stop的時(shí)候殺死這個(gè)進(jìn)程,默認(rèn)不殺死 option.setignorecacheexception( false ); //可選,默認(rèn)false,設(shè)置是否收集crash信息,默認(rèn)收集 option.setenablesimulategps( false ); //可選,默認(rèn)false,設(shè)置是否需要過(guò)濾gps仿真結(jié)果,默認(rèn)需要 locationclient.setlocoption(option); } |
至此所有步驟完成,可以嘗試運(yùn)行一下!
在android studio中使用baidumap sdk實(shí)時(shí)獲取當(dāng)?shù)匚恢眯畔⒌南嚓P(guān)知識(shí)就給大家介紹到這里,希望對(duì)大家有所幫助!