Android 百度地图开发详解
目錄
- 實(shí)驗(yàn)環(huán)境
- 申請(qǐng) API Key
- 使用百度定位
- 準(zhǔn)備 LBS SDK
- 編碼
聲明:本人小白,文章作為自己的學(xué)習(xí)筆記,與大家分享,歡迎大家于本人學(xué)習(xí)交流
本文 refer to
作者:郭霖
書(shū)名:第一行代碼Android第2版
出版社:人民郵電出版社
感謝此書(shū)籍原創(chuàng)者,如有侵犯您的知識(shí)產(chǎn)權(quán)和版權(quán)問(wèn)題,請(qǐng)通知本人,本人會(huì)即時(shí)做出處理并刪除文章
Email:louhergetup@163.com
感謝您閱讀我的文章,未經(jīng)本人許可,文章不得用于商業(yè)用途。轉(zhuǎn)載請(qǐng)注明出處,否則屬于侵權(quán)行為。
實(shí)驗(yàn)環(huán)境
- 操作系統(tǒng):win10 64
- 軟件環(huán)境:Android Studio 3.5.3
- 編程語(yǔ)言:Java 13
申請(qǐng) API Key
首先需要注冊(cè)百度賬號(hào),登陸百度賬號(hào),打開(kāi)網(wǎng)址 http://developer.baidu.com/user/info 填寫注冊(cè)信息并提交,然后去自己的郵箱通過(guò)驗(yàn)證,就完成注冊(cè)了。
接著訪問(wèn) https://lbsyun.baidu.com/apiconsole/key 會(huì)看到下面這個(gè)界面
點(diǎn)擊 創(chuàng)建應(yīng)用 申請(qǐng) API Key, 應(yīng)用名稱可以隨便填,這里填 LBSTest,應(yīng)用類型選擇 Android SDK,啟用服務(wù)保持沉默即可,如下圖所示
發(fā)布版 SHA1 是打包程序時(shí)所用的簽名文件的 SHA1 指紋,可以通過(guò) Android 查看,新建一個(gè) Android Studio 項(xiàng)目,如圖(開(kāi)發(fā)版 SHA1 我們等下再說(shuō))
接下來(lái),一路 Next,就可以了。
點(diǎn)擊右側(cè) Gradle,然后點(diǎn)擊標(biāo)紅的 Sync 按鈕,
然后會(huì)出現(xiàn)下圖
點(diǎn)擊 :app --> Task --> android -->
雙擊 signingReport, 我們即可得到 發(fā)布版SHA1 指紋
把 SHA1: 后面的字符復(fù)制到創(chuàng)建百度地圖應(yīng)用界面的對(duì)應(yīng)位置,
開(kāi)發(fā)版的 SHA1 我們需要?jiǎng)?chuàng)建一個(gè)正式的簽名文件,點(diǎn)擊 Android Studio 頂部工具欄中的 Build --> Generate Signed APK,彈出如下窗口
點(diǎn)擊 Create new… 彈出如下窗口
點(diǎn)擊第一行的三個(gè)點(diǎn),彈出如下窗口,選擇簽名文件保存的路徑,并填寫簽名文件名稱,并點(diǎn)擊 OK
填寫密碼和名字
點(diǎn)擊 OK,會(huì)回到如下界面,然后關(guān)閉這個(gè)窗口
然后按 win + r 輸入 cmd 輸入如下命令,
比如我創(chuàng)建的簽名文件路徑為 D:\miyao.jks\LBSTest.jks ,如圖
輸入你剛才設(shè)置的密碼,如圖
把 SHA1:后的字符復(fù)制到創(chuàng)建百度地圖應(yīng)用界面的對(duì)應(yīng)位置。
包名這里我們填 com.example.a83445.lbstest (包名在我們創(chuàng)建 Android project 的界面中已經(jīng)設(shè)置了)
點(diǎn)擊提交,應(yīng)用就創(chuàng)建成功了
上圖中 OmVEuKl1IxomNQ1jq1qlGnePFpwsIdq6 就是我們申請(qǐng)到的 API Key。
使用百度定位
建議在手機(jī)上運(yùn)行調(diào)試
準(zhǔn)備 LBS SDK
在開(kāi)始編碼之前,我們需要下載百度 LBS 開(kāi)放平臺(tái)的 SDK,下載地址為 http://lbsyun.baidu.com/index.php?title=sdk/download&action#selected=mapsdk_basicmap,mapsdk_searchfunction,mapsdk_lbscloudsearch,mapsdk_calculationtool,mapsdk_radar 選擇 基礎(chǔ)定位 和 基礎(chǔ)地圖 然后點(diǎn)擊 開(kāi)發(fā)包 下載按鈕
解壓下載的文件,在下載文件中 libs 目錄下的內(nèi)容分為兩部分,如圖,BaiduLBS_Android.jar 是 Java 層要使用的,其他子目錄下的 so 文件時(shí) Native 層要用到的。so 文件是用 C/C++ 語(yǔ)言編寫的,然后再用 NDK 編譯出來(lái)的。 我們這里不需要編寫 C/C++ 的代碼,因?yàn)榘俣榷家呀?jīng)做好了封裝, 但是我們需要將 libs 目錄下的每一個(gè)文件都放到正確的位置。
觀察一下當(dāng)前的項(xiàng)目結(jié)構(gòu), app 模塊下有一個(gè) libs 目錄,這里就是用來(lái)存放所有 Jar 包的,我們將 BaiduLBS_Android.jar 復(fù)制到這個(gè)目錄下,如下圖所示
接下來(lái),展開(kāi) src/main 目錄,鼠標(biāo)右鍵點(diǎn)擊該目錄–>New–>Directory, 創(chuàng)建一個(gè)名為 jniLibs 的目錄,這個(gè)目錄是專門用來(lái)存放 so 文件的,然后把壓縮包里的其他所有目錄直接復(fù)制到這里,如圖
為了讓項(xiàng)目引用到 Jar 包中提供的接口,我們需要點(diǎn)擊一下 Android Studio 頂部工具欄的 Sync 按鈕(就是我前面圈出來(lái)那個(gè)按鈕)
點(diǎn)擊 Sync 之后,libs 目錄下的 jar 文件就會(huì)多出一個(gè)向右的箭頭,表示項(xiàng)目已經(jīng)能引用到這些 jar 包
這樣我們就把 LBS 的 SDK 都準(zhǔn)備好了,接下來(lái)就可以開(kāi)始編碼了
編碼
MainActivity.java 代碼如下
public class MainActivity extends AppCompatActivity {public LocationClient mLocationClient;private MapView mapView;private BaiduMap baiduMap;private boolean isFirstLocate = true;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mLocationClient = new LocationClient(getApplicationContext());mLocationClient.registerLocationListener(new MyLocationListener());SDKInitializer.initialize(getApplicationContext());//初始化setContentView(R.layout.activity_main);mapView = (MapView) findViewById(R.id.bmapView);baiduMap = mapView.getMap();baiduMap.setMyLocationEnabled(true);//用于顯示我的位置List<String> permissionList = new ArrayList<>();if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);}if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED){permissionList.add(Manifest.permission.READ_PHONE_STATE);}if (ContextCompat.checkSelfPermission(MainActivity.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(MainActivity.this, permissions, 1);}else {requestLocation();}}//用于首次定位讓地圖移動(dòng)到當(dāng)前位置private void navigateTo(BDLocation location){if(isFirstLocate){LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());//用于存放經(jīng)緯度MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);baiduMap.animateMapStatus(update);update = MapStatusUpdateFactory.zoomTo(16f);//縮放級(jí)別baiduMap.animateMapStatus(update);isFirstLocate = false;}MyLocationData.Builder locationBuilder = new MyLocationData.Builder();locationBuilder.latitude(location.getLatitude());locationBuilder.longitude(location.getLongitude());MyLocationData locationData = locationBuilder.build();baiduMap.setMyLocationData(locationData);}private void requestLocation() {initLocation();mLocationClient.start();//start方法開(kāi)始定位}private void initLocation(){LocationClientOption option = new LocationClientOption();option.setScanSpan(5000);//5秒更新一次位置信息option.setIsNeedAddress(true);//啟用詳細(xì)位置option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);//使用GPS定位mLocationClient.setLocOption(option);}@Overrideprotected void onResume(){super.onResume();mapView.onResume();}@Overrideprotected void onPause(){super.onPause();mapView.onPause();}@Overrideprotected void onDestroy(){super.onDestroy();mLocationClient.stop();//活動(dòng)銷毀mapView.onDestroy();baiduMap.setMyLocationEnabled(false);}@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(final BDLocation location){if(location.getLocType() == BDLocation.TypeGpsLocation|| location.getLocType() == BDLocation.TypeNetWorkLocation){navigateTo(location);}}} }activity_main.xml 布局文件代碼如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent">//地圖控件使其占滿整個(gè)屏幕<com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="match_parent"android:layout_height="match_parent"android:clickable="true"/></LinearLayout>權(quán)限文件 AndroidManifest.xml 代碼如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.a83445.lbstest"><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"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="OmVEuKl1IxomNQ1jq1qlGnePFpwsIdq6" /><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>//注冊(cè)百度 LBS SDK 服務(wù)<serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote"></service></application>至此,Android 百度地圖初步開(kāi)發(fā)完成
總結(jié)
以上是生活随笔為你收集整理的Android 百度地图开发详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: react学习(28)---react中
- 下一篇: Android简单实现百度地图显示及定位