Android利用百度地图API实现定位功能(记录)

编程入门 行业动态 更新时间:2024-10-26 12:22:31

Android利用百度地图API实现定位<a href=https://www.elefans.com/category/jswz/34/1771378.html style=功能(记录)"/>

Android利用百度地图API实现定位功能(记录)

本篇主要介绍一下如何使用百度地图API来实现定位以及地图的基本使用。

效果图如下:

步骤如下:

一、申请APIKey。

(1)注册百度账号并申请开发者资质:

(2)开始创建应用,申请APIKey:

其中,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=""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=""><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实现定位功能(记录)

本文发布于:2023-07-03 14:17:23,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1007556.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:功能   地图   Android   API

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!