
目录
5.百度地图服务
5-1.获得地图API密钥
5-2.下载SDK 开发包
5-3.创建使用百度地图API的项目
5-4.定位到我的位置
本文5-3和5-4小节的代码部分转载自(112条消息) 第一行代码 百度地图 报错 not agree privacyMode, please invoke SDKInitializer.setAgreePrivacy(Context, boolean)_Fly1562的博客-CSDN博客
百度地图服务是目前很常用的地图服务。为了便于Android开发者使用百度地图,百度提供了百度地图Android SDK。它是一套基于Android 2.1及以上版本设备的应用程序接口,适用于Android系统移动设备的地图应用开发。通过调用地图SDK接口,可以轻松访问百度地图服务和数据,构建功能丰富、交互性强的地图类应用程序。
在使用百度地图Android SDK时,首先需要申请密钥(API Key)。如果没有API密钥,就不会向应用程序返回任何地图图块(map tile)。由于该密钥与百度账号相关联,而且还与创建的过程名称有关,因此,在申请密钥前,必须先注册百度账号。获取地图API密钥的具体步骤如下:
(1)在浏览器的地址栏中输入密钥的申请地址:登录百度账号,百度账号注册完成后,输入账号和密码进行百度账号的登录,如果您没有注册为百度开发者,还需要注册为百度开发者。这时,页面将自动跳转到百度地图开放平台开发者激活页面。
(2)百度地图开放平台开发者激活后,单击“申请密钥”按钮,将进入到如下图所示的创建应用页面。
注:输入的包名一定要与创建的应用包名一致!
安全码的组成规则为:Android 签名证书的SHA1值+“;”+packagename (即:数字签名+英文状态下的分号+包名)。在安全码的组成规则中,主要有以下两部分内容需要获取:
◆获取Android签名证书的SHA1值
cmd进入控制台,执行以下操作:
◆获取包名
包名是在AndroidManifest.xml中,通过package属性定义的名称,如图所示:
(3)单击“提交”按钮,返回到如图所示的应用列表页面,在该页面中将显示刚刚创建的应用。
要开发百度地图应用,需要下载百度地图SDK开发包,该包可以到百度地图API网站下载,具体下载步骤如下:
(1)在浏览器的地址栏中输入网址:(112条消息) 第一行代码 百度地图 报错 not agree privacyMode, please invoke SDKInitializer.setAgreePrivacy(Context, boolean)_Fly1562的博客-CSDN博客,进入到百度地图API首页,点击“Android地图SDK”,单击该页面左侧的“产品下载”超链接进入到如图所示的下载页面。
(2)单击“自定义下载”按钮,进入到如图所示的页面,在该页面中根据自己的项目需要勾选相应的功能。
(3)选中如图所示的资源,单击“开发包”按钮开始下载(开发包格式为JAR)。下载完成后,将得到一个名称为 BaiduLBS_AndroidSDK_Lib.zip 的文件。这就是所需要的SDK开发包。
具体步骤如下:
(1)将项目结构类型切换为Project,再解压缩下载的BaiduLBS_ AndroidSDK_Lib.zip文件,将其中的libs目录下的.jar文件复制到Android Studio中该Module的libs 文件夹中,如图所示。
(2)选中.jar文件,单击右键,在弹出的快捷菜单中选择Add As Library...菜单项,添加百度类库。
(3)在srcmain目录中新建目录jnilibs,并将lib目录下的所有文件夹复制到jnilibs目录中。
(4)在AndroidManifest.xml文件的标记中添加
其中,value值为百度地图中申请到的密钥值。
(5)在AndroidManifest.xml文件中添加所需权限。
//获取设备网络状态,禁用后无法获取网络状态//网络权限,当禁用后,无法进行检索等相关业务 //读取设备硬件信息,统计数据 //读取系统信息,包含系统版本等信息,用作统计 //获取设备的网络状态,鉴权所需网络代理 //允许sd卡写权限,需写入地图数据,禁用后无法显示地图 //这个权限用于进行网络定位 //这个权限用于访问GPS定位 //获取统计数据 //使用步行AR导航,配置Camera权限 //程序在手机屏幕关闭后后台进程仍然运行
activity_main.xml
DemoApplication.java
package com.example.baidumap;
import android.app.Application;
import com.baidu.location.LocationClient;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
public class DemoApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
SDKInitializer.setAgreePrivacy(getApplicationContext(),true);
SDKInitializer.initialize(getApplicationContext());
SDKInitializer.setCoordType(CoordType.BD09LL);
LocationClient.setAgreePrivacy(true);
}
}
注:在AndroidManifest.xml文件的application节点下添加:
android:name=".DemoApplication"
MainActivity.java
package com.example.baidumap;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.MapView;
public class MainActivity extends AppCompatActivity {
private MapView mMapView;//声明地图组件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());//初始化地图SDK,一定要放在setContentView之前
setContentView(R.layout.activity_main);
mMapView = (MapView) findViewById(R.id.bmapView);
ActionBar actionBar=getSupportActionBar();
actionBar.hide();
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
mMapView = null;
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
}
}
注:在运行使用百度地图API的程序时,需要连接互联网。
需要在权限管理中把需要使用的权限打开。
运行效果图:
在实现定位到我的位置时,首先要开启定位图层,可以使用com.baidu.mapapi.map.BaiduMap对象的setMyLocationEnabled()方法实现。该方法的语法格式如下:
public final void set MyLocationEnabled(boolean enabled)
其中,enabled 参数用于指定是否允许定位图层,值为true时表示允许,否则为不允许。开启定位图层的代码如下:
mBaiduMap.setMyLocationEnabled(true);
然后创建MyLocationData对象,用于构造定位数据,包括GPS定位时方向角度、纬度坐标、经度坐标、定位精度和时速等。例如,构造定位数据,指定GPS定位时方向角度为100、坐标位置为当前位置,可以使用下面的代码。
MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getAccuracy()) //设置精度 .direction(100) //此处设置开发者获取到的方向信息,顺时针0~360度 .latitude(location.getLatitude()) //设置纬度坐标 .longitude(location.getLongitude()) //设置经度坐标 .build();
注:此处代码将使用Android 原有定位方法。
再设置定位数据,并配置定位图层的一些信息。 代码如下:
mBaiduMap.setMyLocationData(locData); //设置自定义定位图标 BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory .fromResource(R.drawable.icon_geo); mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL; //设置定位模式 //位置构造方式,将定位模式,定义图标添加其中 MyLocationConfiguration config = new MyLocationConfiguration( mCurrentMode, true, mCurrentMarker); mBaiduMap.setMyLocationConfiguration(config); //地图显示定位图标
最后,在不需要定位图层时关闭定位图层。代码如下:
mBaiduMap.setMyLocationEnabled(false); //关闭定位图层
例:
注:该实例在5-3中的项目的基础上进行修改。
MainActivity.java
package com.example.mylocation;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
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;
public class MainActivity extends AppCompatActivity {
private MapView mMapView;//百度地图组件
private BaiduMap mBaiduMap;//定义百度地图对象
private boolean isFirstLoc=true;//记录是否是第一次定位
private MyLocationConfiguration.LocationMode locationMode;//当前定位模式
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());//初始化地图SDK
setContentView(R.layout.activity_main);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
mMapView = findViewById(R.id.mapView);
mBaiduMap = mMapView.getMap();
//获取系统的LocationManager对象
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
//设置每一秒获取一次location信息
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
1000,//更新数据时间为1秒
1,//位置间隔为1米
//位置监听7器
new LocationListener() {//GPS定位信息发生改变时触发,用于更新位置信息
@Override
public void onLocationChanged(@NonNull Location location) {
locationUpdates(location);
}
});
//从GPS获取最新的定位信息
Location location=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
locationUpdates(location);//将最新的定位信息传递给创建的locationUpdates方法中
}
//获取指定的查询信息
public void locationUpdates(Location location) {
if (location != null) {
//获取用户当前经纬度
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
Log.i("location", "纬度:" + location.getLatitude() + " | 经度:" + location.getLongitude());
if(isFirstLoc){
//更新坐标位置
MapStatusUpdate update= MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.animateMapStatus(update);//设置地图位置
isFirstLoc=false;//取消第一次定位
}
//构造定位数据
MyLocationData locationData=new MyLocationData.Builder().accuracy(location.getAccuracy())
.direction(100)//设置方向信息
.latitude(location.getLatitude())//设置纬度坐标
.longitude(location.getLongitude())//设置经度坐标
.build();
mBaiduMap.setMyLocationData(locationData);//设置定位数据
//设置自定义图标
BitmapDescriptor bitmapDescriptor= BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
locationMode=MyLocationConfiguration.LocationMode.NORMAL;//设置定位模式
//设置构造方式
MyLocationConfiguration configuration=new MyLocationConfiguration(locationMode,true,bitmapDescriptor);
mBaiduMap.setMyLocationConfiguration(configuration);//显示定位图标
} else {
Log.i("location", "没有获取到GPS信息");
}
}
@Override
protected void onStart() {
super.onStart();
mBaiduMap.setMyLocationEnabled(true);//开启定位图层
}
@Override
protected void onStop() {
super.onStop();
mBaiduMap.setMyLocationEnabled(false);//停止定位图层
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
mMapView = null;
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
}
}
DemoAppication.java
package com.example.mylocation;
import android.app.Application;
import com.baidu.location.LocationClient;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
public class DemoApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
SDKInitializer.setAgreePrivacy(getApplicationContext(),true);
SDKInitializer.initialize(getApplicationContext());
SDKInitializer.setCoordType(CoordType.BD09LL);
LocationClient.setAgreePrivacy(true);
}
}
注:需要在权限管理中把需要用到的权限打开。