原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/1023/685.html
这一篇文章我们手机App外包就来看看若何对百度地图进行需求的配置以及定位而且表现目前的位置。
一、android集成百度地图(android百度地图SDK系列)
二、android百度地图定位表现目前位置(android百度地图SDK系列)
三、android百度地图笼盖物(android百度地图SDK系列)
一、百度地图根基的配置
我们晓得,一个非常根基的地图是肯定满足不了我们的需求的,以是就要进行少许配置,来改变地图。
开始我们看非常根基的:
//地图控件
private MapView mapView; //百度地图
private BaiduMap baiduMap; /**
* 初始化控件
*/
public void initView(){
mapView = (MapView)findViewById(R.id.mapView);
} /**
* 初始化地图
*/
public void initMap(){ //获得地图实例
baiduMap = mapView.getMap(); /*
配置地图范例
*/
//一般地图
baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); //卫星地图
//baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
//空缺地图, 底子地图瓦片将不会被渲染。在地图范例中配置为NONE,将不会应用流量下载底子地图瓦片图层。应用场景:与瓦片图层一路应用,节减流量,晋升自定义瓦片图下载速率。
//baiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
//开启交通图
baiduMap.setTrafficEnabled(true); //关闭缩放按钮
mapView.showZoomControls(false);
}
以上代码即是非常根基的配置了,很简单的样子,以是但是多停顿在此。
二、定位与表现中间点
说到定位,不得不提起android6.0的动静权限,要是版本小于6.0则不会有题目,一旦大于即是6.0干脆定位就不行了,必需求要求动静权限,以是在这里我就干脆将动静权限简单的说一下。但是朋友们都晓得由于国内许多厂商对android体系进行所谓的包壳,以是我们始终也摸不清这些壳的尿性,是以在这里是选定了PermissionsDispatcher第三方权限框架来做。
下面我们App开发培训就来看看它的用法:
开始在build.gradle里加入依附
compile 'com.github.hotchemi:permissionsdispatcher:2.2.0'annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:2.2.0'
依附胜利后我们先要看看它的几个注解和技巧:
@NeedsPermission:要求权限胜利时
@OnShowRationale:要求权限告诉用户缘故时
@OnPermissionDenied:要求权限被回绝时
@OnNeverAskAgain:要求权限被回绝并勾选不再提醒时
@RuntimePermissions:注释此Activity或Fragment,在Make project生成类时会用到
onRequestPermissionsResult:回调技巧
开始我们对需求定位权限确目前Activity类加上@RuntimePermissions注解:
@RuntimePermissionspublic class MainActivity extends AppCompatActivity {}
下面我们应用上头剩下的注解和技巧来实现对权限的动静要求:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // NOTE: delegate the permission handling to generated method
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
} /**
* 要求权限胜利时
*/
@NeedsPermission(Manifest.permission.ACCESS_COARSE_LOCATION) void ApplySuccess() {
} /**
* 要求权限告诉用户缘故时
* @param request
*/
@OnShowRationale(Manifest.permission.ACCESS_COARSE_LOCATION) void showRationaleForMap(PermissionRequest request) {
showRationaleDialog("应用此功效需求翻开定位的权限", request);
} /**
* 要求权限被回绝时
*
*/
@OnPermissionDenied(Manifest.permission.ACCESS_COARSE_LOCATION) void onMapDenied() {
Toast.makeText(this,"你回绝了权限,该功效不行用",Toast.LENGTH_LONG).show();
} /**
* 要求权限被回绝并勾选不再提醒时
*/
@OnNeverAskAgain(Manifest.permission.ACCESS_COARSE_LOCATION) void onMapNeverAskAgain() {
AskForPermission();
} /**
* 告知用户具体需求权限的缘故
* @param messageResId
* @param request
*/
private void showRationaleDialog(String messageResId, final PermissionRequest request) { new AlertDialog.Builder(this)
.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override
public void onClick(@NonNull DialogInterface dialog, int which) {
request.proceed();//要求权限
}
})
.setNegativeButton("作废", new DialogInterface.OnClickListener() { @Override
public void onClick(@NonNull DialogInterface dialog, int which) {
request.cancel();
}
})
.setCancelable(false)
.setMessage(messageResId)
.show();
} /**
* 被回绝而且不再提醒,提醒用户去配置界面从新翻开权限
*/
private void AskForPermission() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("目前运用贫乏定位权限,请去配置界面翻开\r翻开以后按两次回笼键可回到该运用哦");
builder.setNegativeButton("作废", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) { return;
}
});
builder.setPositiveButton("配置", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + MainActivity.this.getPackageName())); // 凭据包名翻开对应的配置界面
startActivity(intent);
}
});
builder.create().show();
}
我们常州网站开发培训可以看到此中四个注解背面跟得有参数,这个参数即是我们需求要求的权限。而后在onRequestPermissionsResult里出现了以下一句代码:
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
这句代码里的类和技巧是没有的,它是通过对Activity大概Fragment@RuntimePermissions注解后而且进行Make project后才出现的。
至此,定位权限的动静要求就搞定了,上头只是该框架的简单用法。加倍全面的文档:PermissionsDispatcher
既然权限搞定了,辣么我们便一气呵成的实现的定位并表现了。
1.我们在以前的InitMap技巧里加上以下代码:
// 开启定位图层
baiduMap.setMyLocationEnabled(true); //申明LocationClient类
mLocationClient = new LocationClient(this); //注册监听函数
mLocationClient.registerLocationListener(myListener);
initLocation(); //开始定位
mLocationClient.start();
2.申明少许需求的变量,配置定位参数,实现定位监听技巧,配置中间点和marker
//防备每次定位都从新配置中间点和marker
private boolean isFirstLocation = true; //初始化LocationClient定位类
private LocationClient mLocationClient = null; //BDAbstractLocationListener为7.2版本新增的Abstract范例的监听接口,原有BDLocationListener接口
private BDLocationListener myListener = new MyLocationListener(); //经纬度
private double lat; private double lon; /**
* 配置定位参数
*/
private void initLocation() {
LocationClientOption option = new LocationClientOption(); //可选,默认高精度,配置定位模式,高精度,低功耗,仅建筑
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); //可选,默认gcj02,配置回笼的定位后果坐标系
option.setCoorType("bd09ll"); //可选,默认0,即仅定位一次,配置发起定位要求的隔断需求大于即是1000ms才是有用的
int span = 5000;
option.setScanSpan(span); //可选,配置是否需求地点信息,默认不需求
option.setIsNeedAddress(true); //可选,默认false,配置是否应用gps
option.setOpenGps(true); //可选,默认false,配置是否当GPS有用时根据1S/1次频率输出GPS后果
option.setLocationNotify(true); //可选,默认false,配置是否需求位置语义化后果,可以在BDLocation.getLocationDescribe里获得,后果相似于“在北京天安门左近”
option.setIsNeedLocationDescribe(true); //可选,默认false,配置是否需求POI后果,可以在BDLocation.getPoiList里获得
option.setIsNeedLocationPoiList(true); //可选,默认true,定位SDK里面是一个SERVICE,并放到了自力历程,配置是否在stop的时候杀死这个历程,默认不杀死
option.setIgnoreKillProcess(false); //可选,默认false,配置是否网络CRASH信息,默认网络
option.SetIgnoreCacheException(false); //可选,默认false,配置是否需求过滤GPS仿真后果,默认需求
option.setEnableSimulateGps(false);
mLocationClient.setLocOption(option);
} /**
* 实现定位监听 位置一旦有所改变就会挪用这个技巧
* 可以在这个技巧里面获取到定位以后获取到的一系列数据
*/
public class MyLocationListener implements BDLocationListener { @Override
public void onReceiveLocation(BDLocation location) { //获取定位后果
location.getTime(); //获取定位光阴
location.getLocationID(); //获取定位唯一ID,v7.2版本新增,用于排查定位题目
location.getLocType(); //获取定位范例
location.getLatitude(); //获取纬度信息
location.getLongitude(); //获取经度信息
location.getRadius(); //获取定位精准度
location.getAddrStr(); //获取地点信息
location.getCountry(); //获取国度信息
location.getCountryCode(); //获取国度码
location.getCity(); //获取城市信息
location.getCityCode(); //获取城市码
location.getDistrict(); //获取区县信息
location.getStreet(); //获取街道信息
location.getStreetNumber(); //获取街道码
location.getLocationDescribe(); //获取目前位置形貌信息
location.getPoiList(); //获取目前位置周边POI信息
location.getBuildingID(); //室内精准定位下,获取楼宇ID
location.getBuildingName(); //室内精准定位下,获取楼宇称号
location.getFloor(); //室内精准定位下,获取目前位置所处的楼层信息
//经纬度
lat = location.getLatitude();
lon = location.getLongitude();
//这个校验是为了防备每次定位都从新配置中间点和marker
if (isFirstLocation) {
isFirstLocation = false; //配置并表现中间点
setPosition2Center(baiduMap, location, true);
}
}
} /**
* 配置中间点和增加marker
*
* @param map
* @param bdLocation
* @param isShowLoc
*/
public void setPosition2Center(BaiduMap map, BDLocation bdLocation, Boolean isShowLoc) {
MyLocationData locData = new MyLocationData.Builder()
.accuracy(bdLocation.getRadius())
.direction(bdLocation.getRadius()).latitude(bdLocation.getLatitude())
.longitude(bdLocation.getLongitude()).build();
map.setMyLocationData(locData); if (isShowLoc) {
LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(ll).zoom(18.0f);
map.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
}
3.非常后我们在onCreate技巧里进行android版本的校验,凭据android版本来决意干脆定位表现或是需求动静权限以及需求在权限要求胜利的技巧里挪用initMap技巧和性命周期的经管,代码如下:
//当android体系小于5.0的时候干脆定位表现,不消动静要求权限
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
initMap();
} else {
MainActivityPermissionsDispatcher.ApplySuccessWithCheck(this);
} /**
* 要求权限胜利时
*/
@NeedsPermission(Manifest.permission.ACCESS_COARSE_LOCATION) void ApplySuccess() {
initMap();
} @Override
public void onResume() { super.onResume(); //在activity执行onResume时执行mMapView. onResume (),实现地图性命周期经管
mapView.onResume();
} @Override
public void onPause() { super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图性命周期经管
mapView.onPause();
} @Override
public void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图性命周期经管
// 退出时销毁定位
mLocationClient.unRegisterLocationListener(myListener);
mLocationClient.stop(); // 关闭定位图层
baiduMap.setMyLocationEnabled(false);
mapView.onDestroy();
mapView = null;
}
非常后我们常州软件技术培训来看看运转结果
动静要求权限.png
定位表现目前位置.png
到此为止,android集成百度地图的定位与表现目前位置就结束了,从第一篇文章到第二篇所有的地方我都注释的对照细,以便小白进修和参考。非常后由于我公司的名目中还波及到了动静增加点和几多图形笼盖物,以是另有有一篇结尾的文章,朋友们耐心守候~
上篇:上一篇:安卓百度地图6.0以上无法定位的问题
下篇:下一篇:Cocos2d中的网络通讯协议——Socket通讯