Android 百度地图开发详解
目錄
- 實驗環境
- 申請 API Key
- 使用百度定位
- 準備 LBS SDK
- 編碼
聲明:本人小白,文章作為自己的學習筆記,與大家分享,歡迎大家于本人學習交流
本文 refer to
作者:郭霖
書名:第一行代碼Android第2版
出版社:人民郵電出版社
感謝此書籍原創者,如有侵犯您的知識產權和版權問題,請通知本人,本人會即時做出處理并刪除文章
Email:louhergetup@163.com
感謝您閱讀我的文章,未經本人許可,文章不得用于商業用途。轉載請注明出處,否則屬于侵權行為。
實驗環境
- 操作系統:win10 64
- 軟件環境:Android Studio 3.5.3
- 編程語言:Java 13
申請 API Key
首先需要注冊百度賬號,登陸百度賬號,打開網址 http://developer.baidu.com/user/info 填寫注冊信息并提交,然后去自己的郵箱通過驗證,就完成注冊了。
接著訪問 https://lbsyun.baidu.com/apiconsole/key 會看到下面這個界面
點擊 創建應用 申請 API Key, 應用名稱可以隨便填,這里填 LBSTest,應用類型選擇 Android SDK,啟用服務保持沉默即可,如下圖所示
發布版 SHA1 是打包程序時所用的簽名文件的 SHA1 指紋,可以通過 Android 查看,新建一個 Android Studio 項目,如圖(開發版 SHA1 我們等下再說)
接下來,一路 Next,就可以了。
點擊右側 Gradle,然后點擊標紅的 Sync 按鈕,
然后會出現下圖
點擊 :app --> Task --> android -->
雙擊 signingReport, 我們即可得到 發布版SHA1 指紋
把 SHA1: 后面的字符復制到創建百度地圖應用界面的對應位置,
開發版的 SHA1 我們需要創建一個正式的簽名文件,點擊 Android Studio 頂部工具欄中的 Build --> Generate Signed APK,彈出如下窗口
點擊 Create new… 彈出如下窗口
點擊第一行的三個點,彈出如下窗口,選擇簽名文件保存的路徑,并填寫簽名文件名稱,并點擊 OK
填寫密碼和名字
點擊 OK,會回到如下界面,然后關閉這個窗口
然后按 win + r 輸入 cmd 輸入如下命令,
比如我創建的簽名文件路徑為 D:\miyao.jks\LBSTest.jks ,如圖
輸入你剛才設置的密碼,如圖
把 SHA1:后的字符復制到創建百度地圖應用界面的對應位置。
包名這里我們填 com.example.a83445.lbstest (包名在我們創建 Android project 的界面中已經設置了)
點擊提交,應用就創建成功了
上圖中 OmVEuKl1IxomNQ1jq1qlGnePFpwsIdq6 就是我們申請到的 API Key。
使用百度定位
建議在手機上運行調試
準備 LBS SDK
在開始編碼之前,我們需要下載百度 LBS 開放平臺的 SDK,下載地址為 http://lbsyun.baidu.com/index.php?title=sdk/download&action#selected=mapsdk_basicmap,mapsdk_searchfunction,mapsdk_lbscloudsearch,mapsdk_calculationtool,mapsdk_radar 選擇 基礎定位 和 基礎地圖 然后點擊 開發包 下載按鈕
解壓下載的文件,在下載文件中 libs 目錄下的內容分為兩部分,如圖,BaiduLBS_Android.jar 是 Java 層要使用的,其他子目錄下的 so 文件時 Native 層要用到的。so 文件是用 C/C++ 語言編寫的,然后再用 NDK 編譯出來的。 我們這里不需要編寫 C/C++ 的代碼,因為百度都已經做好了封裝, 但是我們需要將 libs 目錄下的每一個文件都放到正確的位置。
觀察一下當前的項目結構, app 模塊下有一個 libs 目錄,這里就是用來存放所有 Jar 包的,我們將 BaiduLBS_Android.jar 復制到這個目錄下,如下圖所示
接下來,展開 src/main 目錄,鼠標右鍵點擊該目錄–>New–>Directory, 創建一個名為 jniLibs 的目錄,這個目錄是專門用來存放 so 文件的,然后把壓縮包里的其他所有目錄直接復制到這里,如圖
為了讓項目引用到 Jar 包中提供的接口,我們需要點擊一下 Android Studio 頂部工具欄的 Sync 按鈕(就是我前面圈出來那個按鈕)
點擊 Sync 之后,libs 目錄下的 jar 文件就會多出一個向右的箭頭,表示項目已經能引用到這些 jar 包
這樣我們就把 LBS 的 SDK 都準備好了,接下來就可以開始編碼了
編碼
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();}}//用于首次定位讓地圖移動到當前位置private void navigateTo(BDLocation location){if(isFirstLocate){LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());//用于存放經緯度MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);baiduMap.animateMapStatus(update);update = MapStatusUpdateFactory.zoomTo(16f);//縮放級別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方法開始定位}private void initLocation(){LocationClientOption option = new LocationClientOption();option.setScanSpan(5000);//5秒更新一次位置信息option.setIsNeedAddress(true);//啟用詳細位置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();//活動銷毀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, "必須同意所有權限才能使用本程序",Toast.LENGTH_SHORT).show();finish();return;}}requestLocation();}else{Toast.makeText(this, "發生未知錯誤", 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">//地圖控件使其占滿整個屏幕<com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="match_parent"android:layout_height="match_parent"android:clickable="true"/></LinearLayout>權限文件 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>//注冊百度 LBS SDK 服務<serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote"></service></application>至此,Android 百度地圖初步開發完成
總結
以上是生活随笔為你收集整理的Android 百度地图开发详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: react学习(28)---react中
- 下一篇: # 研究杂感 × DEA-Malmqui