Android关于百度地图的开发心得(笔记一(配置与基本使用))
Posted Tobey_r1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android关于百度地图的开发心得(笔记一(配置与基本使用))相关的知识,希望对你有一定的参考价值。
android关于百度地图的开发心得(笔记一(配置与基本使用))
关于
最近新项目启动在即,想着公司的老项目中地图的使用(百度地图)的sdk已经比较老了,v4.3版本的。我今天去开发平台下载最新的已经是7_2版本了,有必要更新使用并记录。然后会大概有一个小系列记录,上一个系列的记录webview的使用,只写了一和二是因为我直接用了开源库一篇解决开发问题,有想法的可以看WebLoading开源库,支持https访问好了,闲话到此。
使用
第一步,下载sdk
首先我们到百度开发者平台下载一个Android的sdk,下载页面:,选择我们会使用的如地图、定位然后选择jar,选择开发包下载。然后将下载下来的压缩包解压后的lib中的BaiduLBS_Android.jar添加到我们项目中的lib下,并在lib下新建两个文件夹(armeabi与armeabi-v7a)并将我们下载解压对应文件夹下的内容copy过去:
我们还需要把上图中的BaiduLBS_Android.jar右键添加到library中, 在app目录下的build.gradle文件中android块中配置sourceSets标签,如果没有使用该标签则新增,详细配置代码如下:
sourceSets {
main {
jniLibs.srcDir 'libs'
}
}
还有就是我们定位可能会用到一些图标mark,在V5.1.0后被移除了,所以有需要的话,可以单独下载资源包,有使用的图片我们可以放到assets文件夹下。
地图sdk的混淆如下,需要项目中的build开启混淆才行,minifyEnabled true
具体操作这里不做解释了:
-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}
-keep class com.baidu.vi.** {*;}
-dontwarn com.baidu.**
以下为注意事项
地图SDK自v4.5.0起支持HTTPS协议,开发者可以通过setHttpsEnable(boolean isEnable);控制是否使用https,V5.3.2版本之前版本默认使用http协议;V5.3.2版本之后(包含)默认使用https协议。
如果使用默认的http协议,android9.0+禁止明文访问,所以会在使用的时候出现:
W/System.err: java.io.IOException: Cleartext HTTP traffic to **** not permitted
解决办法:
- 初始化时改用https请求(建议)
- targetSdkVersion 降到27以下
- 配置安全文件network_security_config.xml
配置文件方法:
首先在res/下新建一个xml文件夹,然后新建一个network_security_config.xml,然后里面键入:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
然后在Androidmanifest配置文件内的application中输入:
android:networkSecurityConfig="@xml/network_security_config"
第二步,申请appkey
这里我之前遇到一个问题就是,我申请的时候图省事,我只填了正式版(releas)的sha1值,debug版的没填,导致我打的包在调试的时候地图正常使用,打包之后就会出现地图白板问题(这个你们遇到的话大概率就是appkey的问题),然后我们进行申请。
打包之前,我们先把我们的debug的keystore位置定义一下:
signingConfigs {
debug {
storeFile file('F:/2021NewsProject/xxxx/debug.keystore')
storePassword 'android'
keyAlias = 'androiddebugkey'
keyPassword 'android'
}
}
我这里首先想把项目的debug和release版本包都打好,然后我用的keytool,没在terminal中操作。这里我在我的java目录下使用的如下:
C:\\Program Files\\Java\\jdk1.8.0_152\\bin
我们首先通过cd到这个文件:
cd C:\\Program Files\\Java\\jdk1.8.0_152\\bin
如下图:
然后输入:
keytool -list -v -keystore C:\\Users\\Administrator\\.android\\debug.keystore
然后输入默认的android
然后结果如图:
同样通过输入:
Java\\jdk1.8.0_152\\bin>keytool -list -v -keystore F:\\2021NewsProject\\xxx\\dingyanApp.jks
输入密码获取到对应sha1值,输入到我们申请key的界面里面,然后输入包名,提交将我们创建应用获取到的appkey输入到androidmanifest.xml文件中如下:
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="h4FYkr41xxxxxKWBrfo3tXKCvMo8aId" />
每个人的apikey都是不一样的,添加地图需要的对应权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<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" /> <!-- 用于加快GPS首次定位,可选权限,非必须 -->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
我们还需要定义一个app去继承application,并记得在配置文件中android:name=".App"
如下:
public class App extends Application {
// 这个是我们需要用到的权限组
//如果设置了target > 28,需要增加这个权限,否则不会弹出"始终允许"这个选择框
private static final String BACK_LOCATION_PERMISSION = "android.permission.ACCESS_BACKGROUND_LOCATION";
public static final String[] ARR_NEED_PERMISSIONS = new ArrayList<String>() {
{
add(Manifest.permission.ACCESS_COARSE_LOCATION);
add(Manifest.permission.ACCESS_FINE_LOCATION);
add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
add(Manifest.permission.READ_EXTERNAL_STORAGE);
add(Manifest.permission.READ_PHONE_STATE);
if (Build.VERSION.SDK_INT > 28) {
add(BACK_LOCATION_PERMISSION);
}
}
}.toArray(new String[0]);
@Override
public void onCreate() {
super.onCreate();
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
SDKInitializer.initialize(this);
//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
SDKInitializer.setCoordType(CoordType.BD09LL);
SDKInitializer.setHttpsEnable(false); //这里是我不使用https,主要https会影响一些效率
}
}
第三步,修改页面代码
修改mainactivity.xml:
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
修改MainActivity.java文件:
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
//这个是我用的郭老师的请求框架
//implementation 'com.permissionx.guolindev:permissionx:1.4.0'
PermissionX.init(this).permissions(App.ARR_NEED_PERMISSIONS)
.request(new RequestCallback() {
@Override
public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {
if (allGranted){
initView();
}else {
}
}
});
如果成功的话,可以看到如下界面:
如果不成功的话,可以参考这篇文章对着找下问题,这里我不做赘述。
第四步,定位使用
修改MainActivity.java:
private MapView mMapView = null;
private BaiduMap mBaiduMap;
private LocationClient mLocationClient = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
PermissionX.init(this).permissions(App.ARR_NEED_PERMISSIONS)
.request(new RequestCallback() {
@Override
public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {
if (allGranted){
initView();
}else {
}
}
});
}
private void initView() {
if (mBaiduMap == null)
mBaiduMap = mMapView.getMap();//获取地图实例
//定义BaiduMapOptions对象
mMapView.setLogoPosition(LogoPosition.logoPostionRightTop);
//不显示比例尺
mMapView.showScaleControl(false);
// BaiduMapOptions options = new BaiduMapOptions();
// 开启定位图层,否则对在地图的设置、绘制定位点将无效
mBaiduMap.setMyLocationEnabled(true);
//NORMAL(普通态), FOLLOWING(跟随态), COMPASS(罗盘态)
MyLocationConfiguration myLocationConfiguration = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, true, null, 0, 0);
mBaiduMap.setMyLocationConfiguration(myLocationConfiguration);
//定位初始化
mLocationClient = new LocationClient(this);
//注册LocationListener监听器
MapStatus.Builder builder = new MapStatus.Builder();
//设置缩放中心点以及缩放比例
builder.zoom(18.0f);
//给地图设置状态
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
mLocationClient.registerLocationListener(myListener);
//通过LocationClientOption设置LocationClient相关参数
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);
// option.setCoorType("bd0911");//设置坐标类型
//默认0,即仅定位一次;设置间隔需大于等于1000ms,表示周期性定位
option.setScanSpan(3000);
//默认false,设置是否需要地址信息
option.setIsNeedAddress(true);
//默认false,设置是否需要设备方向传感器的方向结果
option.setNeedDeviceDirect(true);
//设置locationClientOption
mLocationClient.setLocOption(option);
//开启地图定位图层
mLocationClient.start();
}
private BDAbstractLocationListener myListener = new BDAbstractLocationListener(){
@Override
public void onReceiveLocation(BDLocation location) {
if (null != location && location.getLocType() != BDLocation.TypeServerError) {
if (location == null || mMapView == null){
return;
}
MyLocationData locationData = new MyLocationData.Builder()
.accuracy(location.getRadius())
//此处设置开发者获取到的方向信息,顺时针
.direction(location.getDirection())
.latitude(location.getLatitude())
.longitude(location.getLongitude())
.build();
mBaiduMap.setMyLocationData(locationData);
//这里得location.getLatitude()与location.getLongitude()就是我们需要的定位信息
}
}
};
@Override
protected void onResume() {
mMapView.onResume();
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
}
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
}
@Override
protected void onDestroy() {
mLocationClient.stop();
mLocationClient.unRegisterLocationListener(myListener);
mBaiduMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView = null;
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
}
效果图
下一篇将会有一些细致得使用。有问题欢迎批评指正!
以上是关于Android关于百度地图的开发心得(笔记一(配置与基本使用))的主要内容,如果未能解决你的问题,请参考以下文章