Android studio百度地图的使用
由于某些原因Google的網(wǎng)絡(luò)服務(wù)在中國(guó)不可訪問,從而導(dǎo)致網(wǎng)絡(luò)定位方式的API失效,而GPS定位雖然不用網(wǎng)絡(luò),但是必須在室外才能進(jìn)行有效的定位?;谝陨显蚩梢允褂玫谌焦镜腟DK,國(guó)內(nèi)在這領(lǐng)域做得比較好的是百度、高德
一、申請(qǐng)API Key
要想使用百度的LBS功能,首先必須申請(qǐng)一個(gè)API Key。需要百度賬號(hào)才能申請(qǐng),沒有的話可以去注冊(cè)一個(gè)。登錄你的百度賬號(hào),打開http://developer.baidu.com/user/reg鏈接,在里面填寫一些注冊(cè)信息即可(只需填寫帶 * 的部分內(nèi)容就足夠了),然后點(diǎn)擊提交,進(jìn)行郵箱驗(yàn)證,點(diǎn)擊郵件發(fā)來的鏈接就可完成注冊(cè)。
到此一切順利!這樣說明成為了一名百度開發(fā)者。接著訪問http://lbsyun.baidu.com/apiconsole/key。目前新注冊(cè)的用戶列表是空的,點(diǎn)擊創(chuàng)建應(yīng)用就可以去申請(qǐng)APIKey了。應(yīng)用名稱可以隨便填(最好和Android項(xiàng)目名稱相同),應(yīng)用類型選擇Android SDK ,啟用服務(wù)默認(rèn)的就可以。
那么發(fā)布版和開發(fā)版SHA1是什么東西呢? 打開你的Android Stuidio 項(xiàng)目,點(diǎn)擊Android stuidio右側(cè)工具欄的Gradle →項(xiàng)目名稱→:app→Tasks→android,這里展示了項(xiàng)目中所有內(nèi)置的Gradle Tasks,其中signingReport這個(gè)Task可以用來查看簽名文件信息。雙擊文件,結(jié)果如圖所示.查看下方的SHA1即可。注意:我們使用的是debug.keystore文件生成的指紋。這是Android自動(dòng)生成的一個(gè)用于測(cè)試的簽名文件。而當(dāng)應(yīng)用程序發(fā)布時(shí)還需要?jiǎng)?chuàng)建一個(gè)正式的簽名文件,如果需要得到它:可以在cmd中輸入keytool -list -v -keystore <簽名文件路徑> 然后輸入密碼...
我們得到了SHA1指紋就是開發(fā)版的SHA1,但是我們暫時(shí)還沒有發(fā)布版的,兩個(gè)值都填一樣就可以了。最后還有一個(gè)包名,寫我們的應(yīng)用程序的包名,比如com.example.hu.tourismsystem 。然后點(diǎn)擊提交就創(chuàng)建成功了。然后有了 訪問應(yīng)用(AK)就可以完成后續(xù)LBS 開發(fā)工作了。
二、使用百度定位,引入包
沒有Android項(xiàng)目的可以現(xiàn)在創(chuàng)建,不過項(xiàng)目包名要和API key的包名一致。準(zhǔn)備LBS SDK : 下載地址是http://lbsyun.baidu.com/sdk/download,我們這次會(huì)用到基礎(chǔ)地圖和基礎(chǔ)定位這兩個(gè)SDK,將他們勾上,然后點(diǎn)擊“開發(fā)包”下載。下載完后解壓,文件內(nèi)容如圖
將BaiduLBS_Android.jar 復(fù)制到 項(xiàng)目app模塊下的libs 。右鍵src/main目錄創(chuàng)建 Directory 取名為jniLibs的目錄,把壓縮包里的所有文件夾復(fù)制到這里,并且復(fù)制到app/libs下各一份。系統(tǒng)會(huì)在app/build.gradle默認(rèn)有如下聲明:
dependencies {compile fileTree(include: ['*.jar'], dir: 'libs') ...} 并且在buildTypes塊下添加如下代碼 sourceSets {main() {jniLibs.srcDirs = ['libs']} }找到AndroidStuidio頂部工具欄Sync按鈕(sync Project with Gradle files 一般在從右數(shù)第四個(gè)),點(diǎn)擊他。然后薄酒引用成功了,如圖。這樣我們就把LBS的SDK準(zhǔn)備好了。
注意:ksoap2-android... 這個(gè)與本項(xiàng)目無關(guān)
三、確定自己的經(jīng)緯度:
首先在Manifest添加權(quán)限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> ? ? ? 在application標(biāo)簽下添加: <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="KLqE1SiyhO90Osu7ruCO67cbJdidDrgn"/> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > 其中values 為申請(qǐng)到的Api Key,根據(jù)自己情況修改。
布局文件很簡(jiǎn)單:一個(gè)id為positon_textview的TextView。
主程序:
public class ActivityMicroTourism extends AppCompatActivity {public LocationClient mlocationClient;private TextView positionText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_micro_tourism);mlocationClient = new LocationClient(getApplicationContext());mlocationClient.registerLocationListener(new MyLocationListener());positionText = (TextView) findViewById(R.id.position_text_view);List<String> permissionList = new ArrayList<>();if (ContextCompat.checkSelfPermission(ActivityMicroTourism.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);}if (ContextCompat.checkSelfPermission(ActivityMicroTourism.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.READ_PHONE_STATE);}if(ContextCompat.checkSelfPermission(ActivityMicroTourism.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);}if (!permissionList.isEmpty()){String [] permissions =permissionList.toArray(new String[permissionList.size()]);ActivityCompat.requestPermissions(ActivityMicroTourism.this,permissions,1);}else{requestLocation();}}private void requestLocation(){mlocationClient.start();}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {switch (requestCode){case 1:if(grantResults.length>0){for(int result :grantResults){if(result!=PackageManager.PERMISSION_GRANTED){Toast.makeText(this,"必須同意所有權(quán)限才能使用本程序",Toast.LENGTH_SHORT).show();finish();return;}}requestLocation();}else {Toast.makeText(this,"發(fā)生未知錯(cuò)誤",Toast.LENGTH_SHORT).show();finish();}break;default:}}public class MyLocationListener implements BDLocationListener{@Overridepublic void onReceiveLocation(BDLocation bdLocation) {StringBuilder currentPositon =new StringBuilder();currentPositon.append("緯度: ").append(bdLocation.getLatitude()).append(" ");currentPositon.append("經(jīng)線: ").append(bdLocation.getLongitude()).append(" ");/*currentPositon.append("國(guó)家: ").append(bdLocation.getCountry()).append(" ");currentPositon.append("省: ").append(bdLocation.getProvince()).append(" ");currentPositon.append("市: ").append(bdLocation.getCity()).append(" ");currentPositon.append("區(qū): ").append(bdLocation.getDistrict()).append(" ");currentPositon.append("街道: ").append(bdLocation.getStreet()).append(" ");*/currentPositon.append("定位方式: ");if(bdLocation.getLocType()==BDLocation.TypeGpsLocation){currentPositon.append("GPS");}else if(bdLocation.getLocType()==BDLocation.TypeNetWorkLocation){currentPositon.append("Wifi");}positionText.setText(currentPositon);} }在手機(jī)上運(yùn)行該程序查看效果,同意所有權(quán)限,如果出現(xiàn)數(shù)據(jù)則表示成功。(如果只出現(xiàn)了經(jīng)線和緯線,并且值非常離譜,也許只是你的網(wǎng)絡(luò)太差)可以自己在搞個(gè)刷新按鈕添加單擊事件。有三個(gè)權(quán)限是需要在運(yùn)行時(shí)用戶同意的,為啥要添加那么多權(quán)限?因?yàn)椴唤o添不給用。本段代碼總的來說就是權(quán)限添加和權(quán)限驗(yàn)證和獲取位置信息。
如果在用戶在快速移動(dòng)中,怎樣實(shí)時(shí)更新位置?添加或修改如下代碼:
private void initLocation(){LocationClientOption option =new LocationClientOption(); option.setScanSpan(5000); option.setIsNeedAddress(true); mlocationClient.setLocOption(option); } private void requestLocation(){initLocation(); mlocationClient.start(); } @Override protected void onDestroy() {super.onDestroy(); mlocationClient.stop(); } 每隔5秒鐘會(huì)更新一下當(dāng)前位置。更新太快容易消耗手機(jī)電量讓手機(jī)發(fā)熱.setIsNeedAddress 能讓獲取豐富的位置信息,現(xiàn)在可以把onReceiveLocation里的注釋取消了。4、使用百度地圖
布局文件:
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/color_2"android:orientation="vertical" ><com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="match_parent"android:layout_height="match_parent"android:clickable="true"></com.baidu.mapapi.map.MapView><TextViewandroid:id="@+id/position_text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="gone"android:text="!"/> </LinearLayout>主程序:修改 public class ActivityMicroTourism extends AppCompatActivity {...private MapView mapView; // --@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SDKInitializer.initialize(getApplication());//--setContentView(R.layout.activity_micro_tourism);mapView=(MapView)findViewById(R.id.bmapView);//--mlocationClient = new LocationClient(getApplicationContext());mlocationClient.registerLocationListener(new MyLocationListener());...}@Override protected void onPause() {super.onPause();mapView.onPause();}@Overrideprotected void onResume() {super.onResume();mapView.onResume();}@Overrideprotected void onDestroy() {super.onDestroy();mlocationClient.stop();mapView.onDestroy(); //--}}
用手機(jī)運(yùn)行程序,看看百度地圖是否能成功顯示出來,模擬器是不支持百度地圖SDK的。這里注意一點(diǎn)SDKInitializer.initialize()要放在加載頁面之前。
如果能成功在手機(jī)上顯示地圖,那么接下來的任務(wù)就是將地圖移動(dòng)到我的位置,并且能讓我的位置顯示在地圖上.
public class ActivityMicroTourism extends AppCompatActivity {...private BaiduMap baiduMap; //--private boolean isFristLocate=true; //--@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SDKInitializer.initialize(getApplication());setContentView(R.layout.activity_micro_tourism);mapView=(MapView)findViewById(R.id.bmapView);baiduMap=mapView.getMap(); //--baiduMap.setMyLocationEnabled(true);//--mlocationClient = new LocationClient(getApplicationContext());mlocationClient.registerLocationListener(new MyLocationListener());...}private void navigateTo(BDLocation location){if(isFristLocate ){LatLng ll=new LatLng(location.getLatitude(),location.getLongitude());MapStatusUpdate update= MapStatusUpdateFactory.newLatLng(ll);baiduMap.animateMapStatus(update);update=MapStatusUpdateFactory.zoomTo(16f);baiduMap.animateMapStatus(update);isFristLocate=false;}MyLocationData.Builder locationBuilder=new MyLocationData.Builder();locationBuilder.latitude(location.getLatitude());locationBuilder.longitude(location.getLongitude());MyLocationData locationData=locationBuilder.build();baiduMap.setMyLocationData(locationData);}@Overrideprotected void onDestroy() {super.onDestroy();mlocationClient.stop();mapView.onDestroy();baiduMap.setMyLocationEnabled(false); //--}public class MyLocationListener implements BDLocationListener{@Override //--public void onReceiveLocation(BDLocation bdLocation) { if (bdLocation.getLocType()==BDLocation.TypeGpsLocation || bdLocation.getLocType()==BDLocation.TypeNetWorkLocation){navigateTo(bdLocation);}...}@Overridepublic void onConnectHotSpotMessage(String s, int i) {}}}其中,navaigateTo()是用來用來更新位置的,第一次打開程序的時(shí)候會(huì)更新位置
手機(jī)運(yùn)行程序,查看效果。需要注意的幾點(diǎn):
1、在布局文件百度地圖控件會(huì)報(bào)錯(cuò),可以無視,模擬器上運(yùn)行不了可以在手機(jī)上運(yùn)行
2、由于可能某些人的手機(jī)比較舊,剛開始打開程序更新位置會(huì)失敗,可以嘗試添加一個(gè)刷新按鈕,執(zhí)行navaigateTo()函數(shù)
3、更新位置是一個(gè)耗時(shí)比較大的操作,放在主線程中容易造成線程阻塞,最好在子線程中運(yùn)行
4、百度地圖定位坐標(biāo)會(huì)發(fā)生點(diǎn)偏移,坐標(biāo)校正可以參考http://blog.sina.com.cn/s/blog_80a9926b0101ktoa.html
5、更多的開發(fā)指南可以參考 http://lbsyun.baidu.com
總結(jié)
以上是生活随笔為你收集整理的Android studio百度地图的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android通过webservice连
- 下一篇: SQLSever触发器建立