百度地圖應用
- 1.實驗內容
- 2.實驗過程
- 2.1 Android Studio配置
- 2.1. 創建一個Android項目
- 2.2 在項目中本地集成BaiduMap SDK
- 2.2 編寫代碼
- 2.2.1 配置AndroidManifest.xml文件
- 2.2.2 編寫UI界面布局文件
- 2.2.3 編寫主函數代碼
- 2.2.4 運行結果
- 3.學習中遇到的問題及解決
- 4.學習感悟與思考
- 參考資料
1.實驗內容
設計并開發一個地圖應用系統
2.實驗過程
2.1 Android Studio配置
- 由于申請key比較麻煩,本次實驗使用的SDK和AK都直接使用志強老師在群里給出的
2.1. 創建一個Android項目
- 注意語言選擇java會方便些,志強老師給的是java代碼嘿嘿
2.2 在項目中本地集成BaiduMap SDK
- 下載開發包
- 添加jar文件
- 在app下新建libs文件夾
- 添加so文件
- 在src/main下創建jniLibs文件夾,把志強老師的libs包解壓后可以得到so文件,解壓后放入jniLibs文件夾中
- 往工程中添加jar文件
- 菜單欄選擇File -> Project Structure
- 在彈出的Project Structure對話框中選中左側的Modules列表下的app目錄
- 點擊右側頁面中的Dependencies選項卡
- 點擊左上角加號“?”選擇Jar dependency,然后選擇要添加的jar文件路徑
- 添加成功可看到jar包可以展開,build.gradle中可以看到添加了相關依賴。
2.2 編寫代碼
2.2.1 配置AndroidManifest.xml文件
- 添加key(這里的key就用志強老師的啦)
<meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="6lmYlAJwcQUNz2gGwem8VXpq0T7lDGxG" />
- 添加相關權限
<!-- 訪問精確位置的權限 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><!-- 這個權限用于進行網絡定位--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><!-- 獲取運營商信息,用于支持提供運營商信息相關的接口--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
2.2.2 編寫UI界面布局文件
- 以下為main_activity.xml代碼:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><!--百度地圖控件--><com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="fill_parent"android:layout_height="fill_parent"android:clickable="true" /><!--位置文本布局的背景色代碼的前2位代碼為透明度--><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:background="#e0000000"android:orientation="vertical" ><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="12dp"android:layout_marginTop="20dp"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="緯度:"android:textColor="#ffffff"android:textSize="15dp" /><TextViewandroid:id="@+id/tv_Lat"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""android:textColor="#ffffff"android:textSize="15dp" /></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="12dp"android:layout_marginTop="10dp"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="經度:"android:textColor="#ffffff"android:textSize="15dp" /><TextViewandroid:id="@+id/tv_Lon"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""android:textColor="#ffffff"android:textSize="15dp" /></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="10dp"android:layout_marginLeft="12dp"android:layout_marginTop="10dp"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="地址:"android:textColor="#ffffff"android:textSize="15dp" /><TextViewandroid:id="@+id/tv_Add"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""android:textColor="#ffffff"android:textSize="15dp" /></LinearLayout></LinearLayout></FrameLayout>
2.2.3 編寫主函數代碼
- 以下為MainActivity.java完整代碼
package com.example.baidumap;import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.model.LatLng;/*百度地圖應用,包含定位信息和地圖顯示一般需要打開定位服務,選擇高精度定位模式,有網絡連接需要在清單文件里使用百度云服務(參見清單文件service標簽)需要創建應用(模塊)的Key,并寫入清單文件(參見清單文件meta標簽)
*/
public class MainActivity extends AppCompatActivity {LocationClient mLocationClient; //定位客戶端MapView mapView; //Android Widget地圖控件BaiduMap baiduMap;boolean isFirstLocate = true;TextView tv_Lat; //緯度TextView tv_Lon; //經度TextView tv_Add; //地址@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//如果沒有定位權限,動態請求用戶允許使用該權限if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);}else {requestLocation();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode) {case 1:if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {Toast.makeText(this, "沒有定位權限!", Toast.LENGTH_LONG).show();finish();} else {requestLocation();}}}private void requestLocation() {initLocation();mLocationClient.start();}private void initLocation() { //初始化mLocationClient = new LocationClient(getApplicationContext());mLocationClient.registerLocationListener(new MyLocationListener());SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);mapView = findViewById(R.id.bmapView);baiduMap = mapView.getMap();tv_Lat = findViewById(R.id.tv_Lat);tv_Lon = findViewById(R.id.tv_Lon);tv_Add = findViewById(R.id.tv_Add);LocationClientOption option = new LocationClientOption();//設置掃描時間間隔option.setScanSpan(1000);//設置定位模式,三選一option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);/*option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);*///設置需要地址信息option.setIsNeedAddress(true);//保存定位參數mLocationClient.setLocOption(option);}//內部類,百度位置監聽器private class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation bdLocation) {tv_Lat.setText(bdLocation.getLatitude()+"");tv_Lon.setText(bdLocation.getLongitude()+"");tv_Add.setText(bdLocation.getAddrStr());if(bdLocation.getLocType()==BDLocation.TypeGpsLocation || bdLocation.getLocType()==BDLocation.TypeNetWorkLocation){navigateTo(bdLocation);}}}private void navigateTo(BDLocation bdLocation) {if(isFirstLocate){LatLng ll = new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);baiduMap.animateMapStatus(update);isFirstLocate = false;}}@Overrideprotected void onResume() {super.onResume();mapView.onResume();}@Overrideprotected void onPause() {super.onPause();mapView=(MapView)findViewById(R.id.bmapView);mapView.onResume();}@Overrideprotected void onDestroy() {super.onDestroy();mLocationClient.stop();mapView.onDestroy();}
}
2.2.4 運行結果
- 第一次使用時會詢問權限
- 但是用as的虛擬設備會閃退,這里直接使用真機運行,會顯示真機所在地址
3.學習中遇到的問題及解決
- 問題1:as連接蘋果手機檢測不到真機
- 問題1解決方案:若使用蘋果手機作為真機還需安裝xcode等模擬器,這里直接借用舍友的安卓機。
4.學習感悟與思考
- 本次實踐在志強老師給好了key和各類包以及源代碼的基礎上其實不是很難,主要的難點我認為其實在于熟悉as連接不同的設備比如mumu模擬器、IOS真機、Android真機等,現在我已經不用看教程連接真機了(都是淚)。
參考資料
在群聊里捏,給不了大家連接惹……