Android利用百度地图API实现定位功能(记录)
本篇主要介紹一下如何使用百度地圖API來實現定位以及地圖的基本使用。
效果圖如下:
步驟如下:
一、申請APIKey。
(1)注冊百度賬號并申請開發者資質:http://developer.baidu.com/user/reg
(2)開始創建應用,申請APIKey:http://lbsyun.baidu.com/apiconsole/key
其中,SHA1指紋可以通過下面方式獲取:
開發AndroidStudio的任意一個項目,點擊右側工具欄的Gradle->項目名->:app->Tasks->android->signingReport。
二、準備LBS SDK
這里,需要下載基礎地圖和定位功能這兩個SDK,下載好后,解壓一下。
(1)把BaiduLBS_Android.jar復制到libs目錄下。
(2)在main目錄下,創建一個jniLibs目錄,然后把其他所有的文件復制到該目錄下。
(3)然后,運行File下的Sync...同步一下項目,以便可以引用到jar包的相應接口。
三、開始實現定位功能。
(1)布局文件就不說了,首先要修改一下清單文件AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.mylocationdemo"><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.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-data android:name="com.baidu.lbsapi.API_KEY"android:value="Your API Key"/><activity android:name=".SwitchActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".MainActivity"></activity><activity android:name=".MapActivity"></activity><service android:name="com.baidu.location.f"android:enabled="true"android:process=":remote"></service></application></manifest>(2)相應的MainActivity.java的代碼如下:
主要就兩個步驟:申請用戶權限和實現BDLocationListener接口。
package com.example.mylocationdemo;import android.Manifest; import android.content.Context; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast;import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.tbruyelle.rxpermissions2.Permission; import com.tbruyelle.rxpermissions2.RxPermissions;import io.reactivex.functions.Consumer;public class MainActivity extends AppCompatActivity implements View.OnClickListener, BDLocationListener {private Context mContext;private RxPermissions rxPermissions;private Button btnStart;private TextView tvLocationInfo;private LocationClient mLocationClient;private int grantedPermissionNum = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);baseDataInit();bindViews();viewsAddListener();viewsDataInit();}@Overrideprotected void onDestroy() {mLocationClient.stop();super.onDestroy();}private void baseDataInit() {mContext = this;mLocationClient = new LocationClient(mContext);rxPermissions = new RxPermissions(MainActivity.this);}private void bindViews() {btnStart = findViewById(R.id.Main_btnStart);tvLocationInfo = findViewById(R.id.Main_tvLocationInfo);}private void viewsAddListener() {btnStart.setOnClickListener(this);mLocationClient.registerNotifyLocationListener(this);}private void viewsDataInit() {}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.Main_btnStart: {checkUserAllPermissions();break;}default:break;}}/*** 開始定位*/private void startLocation() {initLocation();mLocationClient.start();}/*** 定時更新位置(每隔5s)*/private void initLocation() {LocationClientOption option = new LocationClientOption();option.setScanSpan(5000);//強制使用GPS//option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);//顯示詳細地址信息option.setIsNeedAddress(true);mLocationClient.setLocOption(option);}@Overridepublic void onReceiveLocation(BDLocation bdLocation) {new MyLocationAsyncTask().execute(bdLocation);}/*** 獲取定位信息的異步任務*/class MyLocationAsyncTask extends AsyncTask<BDLocation, Void, String> {@Overrideprotected String doInBackground(BDLocation... bdLocations) {BDLocation bdLocation = bdLocations[0];StringBuilder currentPosition = new StringBuilder();currentPosition.append("緯度:").append(bdLocation.getLatitude()).append("\n");currentPosition.append("經度:").append(bdLocation.getLongitude()).append("\n");currentPosition.append("定位方式:");if (bdLocation.getLocType() == BDLocation.TypeGpsLocation) {currentPosition.append("GPS\n");} else if (bdLocation.getLocType() == BDLocation.TypeNetWorkLocation) {currentPosition.append("網絡\n");}//以下顯示詳細信息currentPosition.append("國家:").append(bdLocation.getCountry()).append("\n");currentPosition.append("省份:").append(bdLocation.getProvince()).append("\n");currentPosition.append("城市:").append(bdLocation.getCity()).append("\n");currentPosition.append("區:").append(bdLocation.getDistrict()).append("\n");currentPosition.append("街道:").append(bdLocation.getStreet()).append("\n");return currentPosition.toString();}@Overrideprotected void onPostExecute(String s) {Toast.makeText(mContext, "更新完成", Toast.LENGTH_SHORT).show();tvLocationInfo.setText(s);}}/*** 申請用戶權限*/private void checkUserAllPermissions() {rxPermissions.requestEach(Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.READ_PHONE_STATE).subscribe(new Consumer<Permission>() {@Overridepublic void accept(Permission permission) throws Exception {if (permission.granted) {grantedPermissionNum ++;} else if (permission.shouldShowRequestPermissionRationale) {} else {Toast.makeText(mContext, "定位服務需要您同意相關權限", Toast.LENGTH_SHORT).show();}if (grantedPermissionNum == 3) {startLocation();}}});} }以上是如何利用百度API來實現定位功能。下面附加一下基礎地圖的使用:
主要就是對MapView的使用以及相關操作。
(1)布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"xmlns:android="http://schemas.android.com/apk/res/android"><com.baidu.mapapi.map.MapViewandroid:id="@+id/Map_mapView"android:layout_width="match_parent"android:layout_height="match_parent"android:clickable="true"></com.baidu.mapapi.map.MapView></LinearLayout>(2)相應的MapActivity.java的代碼如下:
package com.example.mylocationdemo;import android.Manifest; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.widget.Toast;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.map.MyLocationConfiguration; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.model.LatLng; import com.tbruyelle.rxpermissions2.Permission; import com.tbruyelle.rxpermissions2.RxPermissions;import io.reactivex.functions.Consumer;public class MapActivity extends AppCompatActivity {private Context mContext;private RxPermissions rxPermissions;private MapView mapView;private LocationClient mLocationClient;private BaiduMap baiduMap;private int grantedPermissionNum = 0;private boolean isFirstLocate = true;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);//初始化操作一定要在setContentView之前!!!SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_map);rxPermissions = new RxPermissions(MapActivity.this);mContext = this;mLocationClient = new LocationClient(getApplicationContext());mLocationClient.registerNotifyLocationListener(new MyLocationListener());mapView = findViewById(R.id.Map_mapView);baiduMap = mapView.getMap();baiduMap.setMyLocationEnabled(true);//設置定位圖標是否有箭頭baiduMap.setMyLocationConfiguration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, true,null));checkUserAllPermissions();mLocationClient.start();initLocation();}/*** 定時更新位置(每隔5s)*/private void initLocation() {LocationClientOption option = new LocationClientOption();option.setScanSpan(5000);//強制使用GPSoption.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);//顯示詳細地址信息option.setIsNeedAddress(true);mLocationClient.setLocOption(option);}@Overrideprotected void onDestroy() {mLocationClient.stop();mapView.onDestroy();baiduMap.setMyLocationEnabled(false);super.onDestroy();}@Overrideprotected void onResume() {super.onResume();mapView.onResume();}@Overrideprotected void onPause() {super.onPause();mapView.onPause();}public class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation bdLocation) {new MyLocationAsyncTask().execute(bdLocation);}}/*** 獲取定位信息的異步任務*/class MyLocationAsyncTask extends AsyncTask<BDLocation, Void, Void> {@Overrideprotected Void doInBackground(BDLocation... bdLocations) {BDLocation bdLocation = bdLocations[0];if (bdLocation.getLocType() == BDLocation.TypeGpsLocation|| bdLocation.getLocType() == BDLocation.TypeNetWorkLocation) {navigateTo(bdLocation);}return null;}}private void navigateTo(BDLocation location) {if (isFirstLocate) {LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(latLng);baiduMap.animateMapStatus(update);update = MapStatusUpdateFactory.zoomTo(17f);baiduMap.animateMapStatus(update);isFirstLocate = false;}MyLocationData.Builder builder = new MyLocationData.Builder();builder.latitude(location.getLatitude());builder.longitude(location.getLongitude());MyLocationData locationData = builder.build();baiduMap.setMyLocationData(locationData);}/*** 申請用戶權限*/private void checkUserAllPermissions() {rxPermissions.requestEach(Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.READ_PHONE_STATE).subscribe(new Consumer<Permission>() {@Overridepublic void accept(Permission permission) throws Exception {if (permission.granted) {grantedPermissionNum ++;} else if (permission.shouldShowRequestPermissionRationale) {} else {Toast.makeText(mContext, "定位服務需要您同意相關權限", Toast.LENGTH_SHORT).show();}if (grantedPermissionNum == 3) {}}});} }總結
以上是生活随笔為你收集整理的Android利用百度地图API实现定位功能(记录)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 唤客猫获客营销之全员激励
- 下一篇: 电子计算机设置时间,电脑设置年月日_电脑