1.权限
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--//获取设备网络状态,禁用后无法获取网络状态-->
<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" />
<application>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="填写自己的key" />
<service android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"/>
</application>
2.添加assets
在百度上拷贝
assets
drawable
3.初始化___在清单文件中添加--------android:name=".BaseApp"
public class BaseApp extends Application {
@Override
public void onCreate() {
super.onCreate();
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
SDKInitializer.initialize(this);
//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
SDKInitializer.setCoordType(CoordType.BD09LL);
}
}
4.在build文件中
sourceSets {
main {
jniLibs.srcDir 'libs'
}
}
signingConfigs {
debug {
storeFile file('asd.jks')
storePassword "123123"
keyAlias "qwe"
keyPassword "123123"
}
}
5.布局
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
6.在主页面
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initPer();
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
map = mMapView.getMap();
initView();
map.setMyLocationEnabled(true);
load();
initListener();
}
private void initListener() {
BaiduMap.OnMapClickListener listener = new BaiduMap.OnMapClickListener() {
/**
* 地图单击事件回调函数
*
* @param point 点击的地理坐标
*/
@Override
public void onMapClick(LatLng point) {
mEndLatlng = point;
addMarker(point);
}
/**
* 地图内 Poi 单击事件回调函数
*
* @param mapPoi 点击的 poi 信息
*/
@Override
public boolean onMapPoiClick(MapPoi mapPoi) {
return false;
}
};
//设置地图单击事件监听
map.setOnMapClickListener(listener);
}
private void load() {
if (mLocationClient == null) {
//定位初始化
mLocationClient = new LocationClient(this);
//通过LocationClientOption设置LocationClient相关参数
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);
//设置locationClientOption
mLocationClient.setLocOption(option);
//注册LocationListener监听器
MyLocationListener myLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(myLocationListener);
//开启地图定位图层
}
mLocationClient.start();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt:
//定位
getlocation();
break;
case R.id.srech:
LatLng point = new LatLng(39.963175, 116.400244);
addMarker(point);
getsrech();
break;
}
}
private void getsrech() {
String str = ed.getText().toString().trim();
if (TextUtils.isEmpty(str)){
return;
}
mPoiSearch.setOnGetPoiSearchResultListener(listener);
mPoiSearch.searchNearby(new PoiNearbySearchOption()
.location(new LatLng(mlocation.getLatitude(), mlocation.getLongitude()))
.radius(10000)
.keyword(str)
.pageNum(10));
}
private void addMarker(LatLng point) {
map.clear();
//定义Maker坐标点
//LatLng point = new LatLng(39.963175, 116.400244);
//构建Marker图标
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.icon_en);
//构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions()
.position(point)
.title("公共厕所")
.icon(bitmap);
//在地图上添加Marker,并显示
map.addOverlay(option);
}
OnGetPoiSearchResultListener listener = new OnGetPoiSearchResultListener() {
@Override
public void onGetPoiResult(PoiResult poiResult) {
if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {
map.clear();
//创建PoiOverlay对象
PoiOverlay poiOverlay = new PoiOverlay(map);
//设置Poi检索数据
poiOverlay.setData(poiResult);
//将poiOverlay添加至地图并缩放至合适级别
poiOverlay.addToMap();
poiOverlay.zoomToSpan();
}
}
@Override
public void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) {
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
}
//废弃
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
}
};
public class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
//mapView 销毁后不在处理新接收的位置
mlocation = location;
if (location == null || mMapView == null) {
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(location.getDirection()).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
map.setMyLocationData(locData);
}
}
private void getlocation() {
LatLng latLng = new LatLng(mlocation.getLatitude(), mlocation.getLongitude());
//改变地图手势的中心点
map.setMapStatus(MapStatusUpdateFactory.newLatLng(latLng));
}
private void initPer() {
String[] per = new String[]{
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.CAMERA
};
ActivityCompat.requestPermissions(this, per, 100);
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
mPoiSearch.destroy();
}
private void initView() {
bt = (ImageButton) findViewById(R.id.bt);
bt.setOnClickListener(this);
ed = (EditText) findViewById(R.id.ed);
ed.setOnClickListener(this);
srech = (ImageButton) findViewById(R.id.srech);
srech.setOnClickListener(this);
mPoiSearch = PoiSearch.newInstance();
map.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
//marker被点击时回调的方法
//若响应点击事件,返回true,否则返回false
//默认返回false
@Override
public boolean onMarkerClick(Marker marker) {
String title = marker.getTitle();
if (!TextUtils.isEmpty(title)){
showToast(title);
}
//步行导航
walkNavi();
return false;
}
});
}
private void walkNavi() {
WalkNavigateHelper.getInstance().initNaviEngine(this, new IWEngineInitListener() {
@Override
public void engineInitSuccess() {
//引擎初始化成功的回调
routeWalkPlanWithParam();
}
@Override
public void engineInitFail() {
//引擎初始化失败的回调
}
});
}
private void routeWalkPlanWithParam() {
//起终点位置
LatLng startPt = new LatLng(mlocation.getLatitude(),mlocation.getLongitude());
LatLng endPt = mEndLatlng;
//构造WalkNaviLaunchParam
WalkNaviLaunchParam mParam = new WalkNaviLaunchParam().stPt(startPt).endPt(endPt);
//发起算路
WalkNavigateHelper.getInstance().routePlanWithParams(mParam, new IWRoutePlanListener() {
@Override
public void onRoutePlanStart() {
//开始算路的回调
}
@Override
public void onRoutePlanSuccess() {
//算路成功
//跳转至诱导页面
Intent intent = new Intent(MainActivity.this, WNaviGuideActivity.class);
startActivity(intent);
}
@Override
public void onRoutePlanFail(WalkRoutePlanError walkRoutePlanError) {
//算路失败的回调
}
});
}
7.创建PoiOverlay类
public class PoiOverlay extends OverlayManager {
private static final int MAX_POI_SIZE = 10;
private PoiResult mPoiResult = null;
/**
* 构造函数
*
* @param baiduMap 该 PoiOverlay 引用的 BaiduMap 对象
*/
public PoiOverlay(BaiduMap baiduMap) {
super(baiduMap);
}
/**
* 设置POI数据
*
* @param poiResult 设置POI数据
*/
public void setData(PoiResult poiResult) {
this.mPoiResult = poiResult;
}
@Override
public final List<OverlayOptions> getOverlayOptions() {
if (mPoiResult == null || mPoiResult.getAllPoi() == null) {
return null;
}
List<OverlayOptions> markerList = new ArrayList<>();
int markerSize = 0;
for (int i = 0; i < mPoiResult.getAllPoi().size() && markerSize < MAX_POI_SIZE; i++) {
if (mPoiResult.getAllPoi().get(i).location == null) {
continue;
}
markerSize++;
Bundle bundle = new Bundle();
bundle.putInt("index", i);
markerList.add(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromAssetWithDpi("Icon_mark" + markerSize + ".png"))
.extraInfo(bundle)
.position(mPoiResult.getAllPoi().get(i).location));
}
return markerList;
}
/**
* 获取该PoiOverlay的poi数据
*
* @return POI数据
*/
public PoiResult getPoiResult() {
return mPoiResult;
}
/**
* 覆写此方法以改变默认点击行为
*
* @param i 被点击的poi在
* {@link PoiResult#getAllPoi()} 中的索引
* @return true--事件已经处理,false--事件未处理
*/
public boolean onPoiClick(int i) {
// if (mPoiResult.getAllPoi() != null
// && mPoiResult.getAllPoi().get(i) != null) {
// Toast.makeText(BMapManager.getInstance().getContext(),
// mPoiResult.getAllPoi().get(i).name, Toast.LENGTH_LONG)
// .show();
// }
return false;
}
@Override
public final boolean onMarkerClick(Marker marker) {
if (!mOverlayList.contains(marker)) {
return false;
}
if (marker.getExtraInfo() != null) {
return onPoiClick(marker.getExtraInfo().getInt("index"));
}
return false;
}
@Override
public boolean onPolylineClick(Polyline polyline) {
return false;
}
}
8.创建OverlayManager
public abstract class OverlayManager implements OnMarkerClickListener, OnPolylineClickListener {
BaiduMap mBaiduMap = null;
private List<OverlayOptions> mOverlayOptionList = null;
List<Overlay> mOverlayList = null;
/**
* 通过一个BaiduMap 对象构造
*
* @param baiduMap
*/
public OverlayManager(BaiduMap baiduMap) {
mBaiduMap = baiduMap;
// mBaiduMap.setOnMarkerClickListener(this);
if (mOverlayOptionList == null) {
mOverlayOptionList = new ArrayList<OverlayOptions>();
}
if (mOverlayList == null) {
mOverlayList = new ArrayList<Overlay>();
}
}
/**
* 覆写此方法设置要管理的Overlay列表
*
* @return 管理的Overlay列表
*/
public abstract List<OverlayOptions> getOverlayOptions();
/**
* 将所有Overlay 添加到地图上
*/
public final void addToMap() {
if (mBaiduMap == null) {
return;
}
removeFromMap();
List<OverlayOptions> overlayOptions = getOverlayOptions();
if (overlayOptions != null) {
mOverlayOptionList.addAll(getOverlayOptions());
}
for (OverlayOptions option : mOverlayOptionList) {
mOverlayList.add(mBaiduMap.addOverlay(option));
}
}
/**
* 将所有Overlay 从 地图上消除
*/
public final void removeFromMap() {
if (mBaiduMap == null) {
return;
}
for (Overlay marker : mOverlayList) {
marker.remove();
}
mOverlayOptionList.clear();
mOverlayList.clear();
}
/**
* 缩放地图,使所有Overlay都在合适的视野内
* <p>
* 注: 该方法只对Marker类型的overlay有效
* </p>
*
*/
public void zoomToSpan() {
if (mBaiduMap == null) {
return;
}
if (mOverlayList.size() > 0) {
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Overlay overlay : mOverlayList) {
// polyline 中的点可能太多,只按marker 缩放
if (overlay instanceof Marker) {
builder.include(((Marker) overlay).getPosition());
}
}
mBaiduMap.setMapStatus(MapStatusUpdateFactory
.newLatLngBounds(builder.build()));
}
}
}
9.创建WNaviGuideActivity
public class WNaviGuideActivity extends Activity {
private WalkNavigateHelper mNaviHelper;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//获取WalkNavigateHelper实例
mNaviHelper = WalkNavigateHelper.getInstance();
//获取诱导页面地图展示View
View view = mNaviHelper.onCreate(WNaviGuideActivity.this);
if (view != null) {
setContentView(view);
}
//获取语音播报文本
//注意:该接口需要在startWikeNavi方法之前调用。
mNaviHelper.setTTsPlayer(new IWTTSPlayer() {
/**
* 诱导文本回调
* @param s 诱导文本
* @param b 是否抢先播报
* @return
*/
@Override
public int playTTSText(String s, boolean b) {
return 0;
}
});
mNaviHelper.startWalkNavi(WNaviGuideActivity.this);
mNaviHelper.setWalkNaviStatusListener(new IWNaviStatusListener() {
/**
* 普通步行导航模式和步行AR导航模式的切换
*
* @param
* @param walkNaviModeSwitchListener 步行导航模式切换的监听器
*/
@Override
public void onWalkNaviModeChange(int mode, WalkNaviModeSwitchListener walkNaviModeSwitchListener) {
mNaviHelper.switchWalkNaviMode(WNaviGuideActivity.this, mode, walkNaviModeSwitchListener);
}
@Override
public void onNaviExit() {
}
});
mNaviHelper.setRouteGuidanceListener(this, new IWRouteGuidanceListener() {
//诱导图标更新
@Override
public void onRouteGuideIconUpdate(Drawable drawable) {
}
//诱导类型枚举
@Override
public void onRouteGuideKind(RouteGuideKind routeGuideKind) {
}
/**
* 诱导信息
*
* @param charSequence 第一行显示的信息,如“沿当前道路”
* @param charSequence1 第二行显示的信息,比如“向东出发”,第二行信息也可能为空
*/
@Override
public void onRoadGuideTextUpdate(CharSequence charSequence, CharSequence charSequence1) {
}
//总的剩余距离
@Override
public void onRemainDistanceUpdate(CharSequence charSequence) {
}
//总的剩余时间
@Override
public void onRemainTimeUpdate(CharSequence charSequence) {
}
//GPS状态发生变化,来自诱导引擎的消息
@Override
public void onGpsStatusChange(CharSequence charSequence, Drawable drawable) {
}
//已经开始偏航
@Override
public void onRouteFarAway(CharSequence charSequence, Drawable drawable) {
}
//偏航规划中
@Override
public void onRoutePlanYawing(CharSequence charSequence, Drawable drawable) {
}
//重新算路成功
@Override
public void onReRouteComplete() {
}
//抵达目的地
@Override
public void onArriveDest() {
}
//震动
@Override
public void onVibrate() {
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == ArCameraView.WALK_AR_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
mNaviHelper.startCameraAndSetMapView(WNaviGuideActivity.this);
} else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_DENIED) {
Toast.makeText(this, "需要开启相机使用权限", Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onResume() {
super.onResume();
mNaviHelper.resume();
}
@Override
protected void onPause() {
super.onPause();
mNaviHelper.pause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mNaviHelper.quit();
}
}
网友评论