使用百度Android地图SDK显示地图定位
生活随笔
收集整理的這篇文章主要介紹了
使用百度Android地图SDK显示地图定位
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ? 同樣參考:百度Android地圖SDK官方文檔
? ? ? ? 建議使用Android Studio3.0版本,最初我使用書中的2.0版本,導入BaiduLBS_Android.jar庫之后報出各種錯誤,改一個就會出現另一個錯誤。于是下了一個AS3.5.0版本,并按照百度開發者文檔中所要求的步驟成功移植庫。
? ? ? ?此案例是在上一個定位的案例的基礎上修改的,具體查看:使用百度API獲取位置信息
一、配置AndroidManifest.xml文件
? ? ? ?由于不僅要顯示地圖,還要定位,所以我們的權限有點多。其中顯示地圖的權限為:
<!-- 訪問網絡,進行地圖相關業務數據請求,包括地圖數據,路線規劃,POI檢索等 --><uses-permission android:name="android.permission.INTERNET" /><!-- 獲取網絡狀態,根據網絡狀態切換進行數據請求網絡轉換 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- 讀取外置存儲。如果開發者使用了so動態加載功能并且把so文件放在了外置存儲區域,則需要申請該權限,否則不需要 --><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><!-- 寫外置存儲。如果開發者使用了離線地圖,并且數據寫在外置存儲區域,則需要申請該權限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />地圖上顯示定位的權限:
? <!-- 這個權限用于進行網絡定位 --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!-- 這個權限用于訪問GPS定位 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />?最終的AndroidManifest.xml文件為:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.lbstest"><!-- 訪問網絡,進行地圖相關業務數據請求,包括地圖數據,路線規劃,POI檢索等 --><uses-permission android:name="android.permission.INTERNET" /><!-- 獲取網絡狀態,根據網絡狀態切換進行數據請求網絡轉換 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- 讀取外置存儲。如果開發者使用了so動態加載功能并且把so文件放在了外置存儲區域,則需要申請該權限,否則不需要 --><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><!-- 寫外置存儲。如果開發者使用了離線地圖,并且數據寫在外置存儲區域,則需要申請該權限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 這個權限用于進行網絡定位 --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!-- 這個權限用于訪問GPS定位 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><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"android:name=".DemoApplication"><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="XkgsMYYtBgIblZ0NLD3DUnF35cf3oFFV" ></meta-data><serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote"></service><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>二、顯示地圖
? ? ? ?1.前端部分
? ? ? ? 這里顯示了普通的地圖,衛星圖,交通圖和熱力圖,首先我們的前端界面,也就是activity_main.xml文件為:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/normal_map"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="普通圖"/><Buttonandroid:id="@+id/satellite_map"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="衛星圖"/><Buttonandroid:id="@+id/traffic_map"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="交通圖"/><Buttonandroid:id="@+id/heart_map"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="熱力圖"/></LinearLayout><com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="match_parent"android:layout_height="match_parent"android:clickable="true"/></LinearLayout>界面預覽為:
2.邏輯代碼
? ? ?按照官網的要求,先新建一個自定義的Application,在其onCreate方法中完成SDK的初始化:
?代碼為:
public class DemoApplication extends Application {@Overridepublic void onCreate() {super.onCreate();//在使用SDK各組件之前初始化context信息,傳入ApplicationContextSDKInitializer.initialize(this);//自4.3.0起,百度地圖SDK所有接口均支持百度坐標和國測局坐標,用此方法設置您使用的坐標類型.//包括BD09LL和GCJ02兩種坐標,默認是BD09LL坐標。SDKInitializer.setCoordType(CoordType.BD09LL);} }注意在AndroidManifest.xml文件中聲明該Application
然后編輯MainActivity中的邏輯代碼:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {private MapView mMapView = null;private BaiduMap mBaiduMap =null;private LocationClient mLocationClient = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);Button normalMap = (Button)findViewById(R.id.normal_map);Button intalliteMap = (Button)findViewById(R.id.satellite_map);Button trafficMap = (Button)findViewById(R.id.traffic_map);Button heartMap = (Button)findViewById(R.id.heart_map);normalMap.setOnClickListener(this);intalliteMap.setOnClickListener(this);trafficMap.setOnClickListener(this);heartMap.setOnClickListener(this);//獲取地圖控件引mMapView = (MapView) findViewById(R.id.bmapView);mBaiduMap = mMapView.getMap();//普通地圖 ,mBaiduMap是地圖控制器對象mBaiduMap.setMyLocationEnabled(true);//權限相關邏輯List<String>permissionList = new ArrayList<>();if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_NETWORK_STATE)!= PackageManager.PERMISSION_GRANTED){permissionList.add(Manifest.permission.ACCESS_NETWORK_STATE);}if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.INTERNET)!= PackageManager.PERMISSION_GRANTED){permissionList.add(Manifest.permission.INTERNET);}if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);}if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){permissionList.add(Manifest.permission.READ_EXTERNAL_STORAGE);}if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED){permissionList.add(Manifest.permission.ACCESS_COARSE_LOCATION);}if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);}//如果非空if(!permissionList.isEmpty()){String[] permissions = permissionList.toArray(new String[permissionList.size()]);ActivityCompat.requestPermissions(MainActivity.this,permissions,1);}else{}}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.normal_map:mBaiduMap.setTrafficEnabled(false);mBaiduMap.setBaiduHeatMapEnabled(false);mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);break;case R.id.satellite_map:mBaiduMap.setTrafficEnabled(false);mBaiduMap.setBaiduHeatMapEnabled(false);mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);break;case R.id.heart_map:mBaiduMap.setTrafficEnabled(false);mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);mBaiduMap.setBaiduHeatMapEnabled(true);break;case R.id.traffic_map:mBaiduMap.setBaiduHeatMapEnabled(false);mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);mBaiduMap.setTrafficEnabled(true);}}@Overrideprotected void onResume() {super.onResume();//在activity執行onResume時執行mMapView. onResume (),實現地圖生命周期管理mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();//在activity執行onPause時執行mMapView. onPause (),實現地圖生命周期管理mMapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();//在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命周期管理mMapView.onDestroy();}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull 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;}}//同意了才會執行到這里}else{Toast.makeText(this,"發生未知錯誤",Toast.LENGTH_SHORT).show();finish();}}}public class MyLocationListener extends BDAbstractLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {//mapView 銷毀后不在處理新接收的位置if (location == null || mMapView == null){return;}MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())// 此處設置開發者獲取到的方向信息,順時針0-360.direction(location.getDirection()).latitude(location.getLatitude()).longitude(location.getLongitude()).build();mBaiduMap.setMyLocationData(locData);}} }結果顯示為:
?
?
?三、將自己顯示到地圖上
?修改MainActivity.java中的代碼
?
//定位初始化mLocationClient = new LocationClient(this);//通過LocationClientOption設置LocationClient相關參數LocationClientOption option = new LocationClientOption();option.setOpenGps(true); // 打開gpsoption.setCoorType("bd09ll"); // 設置坐標類型option.setScanSpan(1000);//設置locationClientOptionmLocationClient.setLocOption(option);//注冊LocationListener監聽器MyLocationListener myLocationListener = new MyLocationListener();mLocationClient.registerLocationListener(myLocationListener); MyLocationConfiguration mLocationConfiguration = new MyLocationConfiguration(LocationMode.FOLLOWING,true,BitmapDescriptorFactory.fromResource(R.drawable.dead));mBaiduMap.setMyLocationConfiguration(mLocationConfiguration);顯示圖標的話可以去:iconfont-阿里巴巴矢量圖標庫
注意吧那個圖標的像素改小點!!!
?
?運行效果:
?
總結
以上是生活随笔為你收集整理的使用百度Android地图SDK显示地图定位的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript逻辑运算符的使用技巧
- 下一篇: 前端学习(3135):react-hel