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博客
5.百度地图服务
百度地图服务是目前常用的地图服务。为了便于Android开发者使用百度地图,百度提供百度地图Android SDK。它是一套基于Android 2.1及以上版本设备的应用接口适用于Android地图应用开发系统移动设备。调用地图SDK接口可以轻松访问百度地图服务和数据,构建功能丰富、交互性强的地图应用。
5-1.获得地图API密钥
使用百度地图Android SDK首先,你需要申请密钥(API Key)。如果没有API密钥不会返回任何地图块到应用程序(map tile)。由于密钥与百度账号相关,也与创建过程名称有关,因此在申请密钥之前,必须先注册百度账号。获取地图API密钥的具体步骤如下:
(1)在浏览器的地址栏中输入密钥申请地址:登录百度账户。百度账户注册后,输入账户和密码登录百度账户。如果您不注册为百度开发人员,您还需要注册为百度开发人员。此时,页面将自动跳转到百度地图开放平台开发人员激活页面。
(2)百度地图开放平台开发者激活后,单击申请密钥按钮,进入下图所示的创建应用页面。
输入的包名必须与创建的应用包名一致!
安全码的组成规则如下:Android 签名证书的SHA1值 “;” packagename (即:数字签名 英语状态下的分号 包名)。在安全码的组成规则中,需要获得以下两部分:
◆获取Android签名证书的SHA1值
cmd进入控制台,执行以下操作:
◆获取包名
包名是在AndroidManifest.xml中,通过package如图所示:
(3)单击提交按钮,返回到如图所示的应用列表页面,新创建的应用的应用程序。
5-2.下载SDK 开发包
要开发百度地图应用,需要下载百度地图SDK开发包可以去百度地图API具体下载步骤如下:
(1)在浏览器地址栏输入网站:(112条消息) 第一行代码 百度地图 报错 not agree privacyMode, please invoke SDKInitializer.setAgreePrivacy(Context, boolean)_Fly1562的博客-CSDN博客,进入百度地图API点击主页Android地图SDK单击页面左侧的产品下载超链接进入下载页面。
(2)单击自定义下载按钮,输入如图所示的页面,并根据自己的项目需要在页面中检查相应的功能。
(3)选择如图所示的资源,单击开发包按钮开始下载(开发包格式为JAR)。下载后,您将获得一个名称 文件。这就是所需要的。SDK开发包。
5-3.创建和使用百度地图API的项目
具体步骤如下:
(1)将工程结构类型切换为Project,再次压缩下载BaiduLBS_ AndroidSDK_Lib.zip文件,其中之一libs目录下的.jar文件复制到Android Studio中该Module的libs 文件夹中,如图所示。
(2)选中.jar文件,单击右键,选择弹出快捷菜单Add As Library...菜单项,添加百度类库。
(3)在src\main在目录中新建目录jnilibs,并将lib复制目录下的所有文件夹jnilibs目录中。
(4)在AndroidManifest.xml文件的<application>标记中添加<meta-data>用于指定密钥的子标记开发。
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="MXrarkfRCGLaHGVEGNpRqTxH8es005pr"/>
其中,value该值为百度地图上申请的密钥值。
(5)在AndroidManifest.xml所需权限添加到文件中。
///获取设备网络状态,禁用后无法获得网络状态 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> //网络权限,禁用后无法检索等相关业务 <uses-permission android:name=
"android.permission.INTERNET"
/>
//读取设备硬件信息,统计数据
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
//读取系统信息,包含系统版本等信息,用作统计
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
//获取设备的网络状态,鉴权所需网络代理
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
//允许sd卡写权限,需写入地图数据,禁用后无法显示地图
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
//这个权限用于进行网络定位
<uses-permission android:name="android.permission.WRITE_SETTINGS" tools:ignore="ProtectedPermissions" />
//这个权限用于访问GPS定位
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
//获取统计数据
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
//使用步行AR导航,配置Camera权限
<uses-permission android:name="android.permission.CAMERA" />
//程序在手机屏幕关闭后后台进程仍然运行
<uses-permission android:name="android.permission.WAKE_LOCK" />
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:clickable="true" android:layout_width="match_parent" android:layout_height="match_parent"/>
package com.example.baidumap;
import android.app.Application;
import com.baidu.location.LocationClient;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
/** * Created by lyr * on 2022/7/26 */
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"
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的程序时,需要连接互联网。
需要在权限管理中把需要使用的权限打开。
运行效果图:
5-4.定位到我的位置
在实现定位到我的位置时,首先要开启定位图层,可以使用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中的项目的基础上进行修改。
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();
}
}
package com.example.mylocation;
import android.app.Application;
import com.baidu.location.LocationClient;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
/** * Created by lyr * on 2022/7/26 */
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);
}
}
需要在权限管理中把需要用到的权限打开。