个人笔记整理
基于位置的服务 百度地图API 申请API前往百度开放服务平台 (baidu.com)注册开发者
来到控制台 | 百度地图开放平台 (baidu.com)创建应用
应用名称随意,应用类型选择【Android SDK】
获取开发版(debug) SHA1前往系统的.android目录,默认位于~/.android
输入命令
E:codeAndroid.android>keytool -list -v -keystore debug.keystore
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: androiddebugkey
创建日期: 2021-2-27
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: C=US, O=Android, CN=Android Debug
发布者: C=US, O=Android, CN=Android Debug
序列号: 1
有效期为 Sat Feb 27 18:40:11 CST 2021 至 Mon Feb 20 18:40:11 CST 2051
证书指纹:
MD5: 84:9D:C6:94:D8:2F:C2:90:00:00:00:00:00:00:00:00
SHA1: D2:4C:7C:89:85:83:9A:68:1C:6F:FF:0F:00:00:00:00:00:00:00:00
SHA256: EF:5A:67:E6:15:68:64:05:AD:95:90:7F:0F:5C:34:2B:79:54:15:C0:85:94:1E:9B:00:00:00:00:00:00:00:00
签名算法名称: SHA1withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 1
*******************************************
*******************************************
Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore debug.keystore -destkeystore debug.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
获取发布板(release) SHA1
Android百度地图开发-第一篇:申请、搭建百度地图 - zhangmiao14 - 博客园 (cnblogs.com)创建相应的签名文件,并获取相应的SHA1
(测试,可以相同)
包名正常设置 点击提交 可复制key,或者[设置]修改上述配置 使用百度定位官方开发文档:Android地图SDK | 百度地图API SDK (baidu.com)
下载&配置SDK 下载SDKSDK下载 - 百度LBS开放平台 (baidu.com)
(根据需要)选择基础定位和基础地图,选择jar格式、标准开发包选择下载
配置SDK解压下载的jar包,然后进入libs目录
选择其中的BaiduLBS_Android.jar文件放入项目中app/libs目录
// gradle中需配置
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
...
}
之后新建src/main/jniLibs目录,将 剩余所有 复制到此处
项目配置 AndroidManifest配置代码
动态申请权限代码示例
public class MainActivity extends AppCompatActivity {
public LocationClient mLocationClient;
private TextView positionText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient = new LocationClient(getApplicationContext());
// 注册一个定位监听器,当获得位置时,就会回调该监听器
mLocationClient.registerLocationListener(new MyLocationListener());
setContentView(R.layout.activity_main);
positionText = (TextView) findViewById(R.id.position_text_view);
//动态申请权限
// 申请权限较多,建立权限数组
List permissionList = new ArrayList<>();
// 如果没有该权限,就将该权限添加到权限数组中
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.
permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.
permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.
permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
// 如果权限数组不为空,则证明有权限未申请
if (!permissionList.isEmpty()) {
// 将该申请的权限转换为String[]数组
String [] permissions = permissionList.toArray(new String[permissionList.
size()]);
// 进行权限的申请
ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
} else {
requestLocation();
}
}
private void requestLocation() {
mLocationClient.start();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
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;
}
}
//同意所有权限后,加载位置
requestLocation();
} else {
Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
// 获得相应参数
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
runOnUiThread(new Runnable() {
@Override
public void run() {
StringBuilder currentPosition = new StringBuilder();
currentPosition.append("纬度:").append(location.getLatitude()).
append("n");
currentPosition.append("经线:").append(location.getLongitude()).
append("n");
currentPosition.append("定位方式:");
if (location.getLocType() == BDLocation.TypeGpsLocation) {
currentPosition.append("GPS");
} else if (location.getLocType() ==
BDLocation.TypeNetWorkLocation) {
currentPosition.append("网络");
}
positionText.setText(currentPosition);
}
});
}
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
}
}
实时更新位置
public class MainActivity extends AppCompatActivity {
...
private void requestLocation() {
initLocation();
mLocationClient.start();
}
private void initLocation(){
LocationClientOption option = new LocationClientOption();
option.setScanSpan(5000);
mLocationClient.setLocOption(option);
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
}
...
}
选择定位模式
上述方式为网络定位
切换到GPS定位。手机设置:位置信息模式→高精确度
定位模式进行指定,一共有3种模式可选:Hight_Accuracy、Battery_Saving和Device_Sensors。
Hight_Accuracy表示高精确度模式,会在GPS信号正常的情况下优先使用GPS定位,在无法接收GPS信号的时候使用网络定位。
Battery_Saving表示节电模式,只会使用网络进行定位。
Device_Sensors表示传感器模式,只会使用GPS进行定位。
其中,Hight_Accuracy是默认的模式。
private void initLocation(){
LocationClientOption option = new LocationClientOption();
option.setScanSpan(5000);
// 设置定位模式
option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);
mLocationClient.setLocOption(option);
}
显示位置相关信息
// 设置LocationClientOption的 需要获取当前位置详细的地址信息
option.setIsNeedAddress(true);
StringBuilder currentPosition = new StringBuilder();
currentPosition.append("纬度:").append(location.getLatitude()).
append("n");
currentPosition.append("经线:").append(location.getLongitude()).
append("n");
currentPosition.append("国家:").append(location.getCountry()).
append("n");
currentPosition.append("省:").append(location.getProvince()).
append("n");
currentPosition.append("市:").append(location.getCity()).
append("n");
currentPosition.append("区:").append(location.getDistrict()).
append("n");
currentPosition.append("街道:").append(location.getStreet()).
append("n");
currentPosition.append("定位方式:");
if (location.getLocType() == BDLocation.TypeGpsLocation) {
currentPosition.append("GPS");
} else if (location.getLocType() ==
BDLocation.TypeNetWorkLocation) {
currentPosition.append("网络");
}
positionText.setText(currentPosition);
使用百度地图
添加地图控件
添加Application继承类
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//初始化百度地图
SDKInitializer.initialize(this);
}
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
mapView.onDestroy();
}
...
}
定位到当前位置
先获得地图总控制器
BaiduMap baiduMap = mapView.getMap();
设置缩放级别
// 设置缩放级别(3~21),值越大地图越精细 MapStatusUpdate update = MapStatusUpdateFactory.zoomTo(12.5f); // 最后需要调用该方法 使update的设置生效 baiduMap.animateMapStatus(update);
设置经纬度
LatLng ll = new LatLng(39.915, 116.404); MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll); baiduMap.animateMapStatus(update);
public class MainActivity extends AppCompatActivity {
...
private BaiduMap baiduMap;
private boolean isFirstLocate = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化要在 setContentView 前
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
setContentView(R.layout.activity_main);
mapView = (MapView) findViewById(R.id.bmapView);
// 获得Map控制器
baiduMap = mapView.getMap();
// 启用我的位置显示
baiduMap.setMyLocationEnabled(true);
...
}
private void navigateTo(BDLocation location) {
// 判断是不是第一次定位
// 定位到当前位置,同时设置精度
if (isFirstLocate) {
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
baiduMap.animateMapStatus(update);
update = MapStatusUpdateFactory.zoomTo(16f);
baiduMap.animateMapStatus(update);
isFirstLocate = false;
}
// 封装设备当前所在位置
MyLocationData.Builder locationBuilder = new MyLocationData.Builder();
locationBuilder.latitude(location.getLatitude());
locationBuilder.longitude(location.getLongitude());
MyLocationData locationData = locationBuilder.build();
// 设置上“我的位置”
baiduMap.setMyLocationData(locationData);
}
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location.getLocType() == BDLocation.TypeGpsLocation
|| location.getLocType() == BDLocation.TypeNetWorkLocation) {
// 初始化地图
navigateTo(location);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
mapView.onDestroy();
// 关闭我的位置显示,节约资源
baiduMap.setMyLocationEnabled(false);
}
}



