下面只是关键类 其他接口 请到百度地图SDK自行查找
PS: 第一次写博客 不知道格式 有何意见 请留言 望大家多多指教
package com.usian.daohang;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.bikenavi.BikeNavigateHelper;
import com.baidu.mapapi.bikenavi.adapter.IBEngineInitListener;
import com.baidu.mapapi.bikenavi.adapter.IBRoutePlanListener;
import com.baidu.mapapi.bikenavi.model.BikeRoutePlanError;
import com.baidu.mapapi.bikenavi.params.BikeNaviLauchParam;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.CircleOptions;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.Stroke;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.overlayutil.PoiOverlay;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiCitySearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiDetailSearchOption;
import com.baidu.mapapi.search.poi.PoiIndoorResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private BikeNavigateHelper instance;
private MapView mMap;
private Button sousuo;
private EditText place;
private BaiduMap mBaiduMap;
private int isShowOverlay = 1;
private boolean isFirstLoc = true;
private LocationClient mLocClient;
private MyLocationConfiguration.LocationMode mCrrentMode;
private BitmapDescriptor mCurrentMarker = null;
private double latitude;
private double longitude;
private MyLocationListenner loclistener = new MyLocationListenner();
Marker marker;
private PoiSearch poiSearch;
private static final int BAIDU_READ_PHONE_STATE =100;
public void showContacts(){
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED
|| ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED
|| ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
!= PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getApplicationContext(),"没有权限,请手动开启定位权限",Toast.LENGTH_SHORT).show();
// 申请一个(或多个)权限,并提供用于回调返回的获取码(用户定义)
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE}, BAIDU_READ_PHONE_STATE);
}else{
// init();
}
}
//Android6.0申请权限的回调方法
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
// requestCode即所声明的权限获取码,在checkSelfPermission时传入
case BAIDU_READ_PHONE_STATE:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 获取到权限,作相应处理(调用定位SDK应当确保相关权限均被授权,否则可能引起定位失败)
// init();
} else {
// 没有获取到权限,做特殊处理
Toast.makeText(getApplicationContext(), "获取位置权限失败,请手动开启", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//判断是否6.0火或以上版本
if (Build.VERSION.SDK_INT>=23){
showContacts();
}else{
// init();//init为定位方法
}
mMap = (MapView) findViewById(R.id.baidu);
place = (EditText) findViewById(R.id.place);
sousuo = (Button) findViewById(R.id.sousuo);
sousuo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String keyword = place.getText().toString().trim();
//创建检索实例
poiSearch = PoiSearch.newInstance();
//设置监听器
poiSearch.setOnGetPoiSearchResultListener(new MyPoiListener());
poiSearch.searchInCity((new PoiCitySearchOption())
.city("北京")
.keyword(keyword)
.pageNum(10));
}
});
mBaiduMap = mMap.getMap();
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
mBaiduMap.setMyLocationEnabled(true);
mLocClient = new LocationClient(this);
//注册定位监听
mLocClient.registerLocationListener(loclistener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);
option.setCoorType("bd0911");
option.setScanSpan(5000);
option.setIsNeedAddress(true);
option.setLocationNotify(true);
mLocClient.setLocOption(option);
mLocClient.start();
addMyLocation();
addCircleOverlay();
}
//控制导航
public void kongzhi(final double la, final double lo){
instance = BikeNavigateHelper.getInstance();
instance.initNaviEngine(this, new IBEngineInitListener() {
@Override
public void engineInitSuccess() {
Log.e("TAG", "引擎初始化成功");
routePlanWithParam(la, lo);
}
@Override
public void engineInitFail() {
Log.e("TAG", "引擎初始化失败");
}
});
}
//开始导航
private void routePlanWithParam(double mLa, double mLo) {
double mLat1 = 39.915291;
double mLon1 = 116.403857;
// 百度大厦坐标
double mLat2 = 40.056858;
double mLon2 = 116.308194;
// LatLng pt1 = new LatLng(mLat1, mLon1);
// LatLng pt2 = new LatLng(mLat2, mLon2);
LatLng pt1 = new LatLng(latitude, longitude);
LatLng pt2 = new LatLng(mLa, mLo);
BikeNaviLauchParam param = new BikeNaviLauchParam().stPt(pt1).endPt(pt2);
// .InvokeStartName("天安门").InvokeEndName("百度大厦");;
instance.routePlanWithParams(param, new IBRoutePlanListener() {
@Override
public void onRoutePlanStart() {
}
@Override
public void onRoutePlanSuccess() {
Toast.makeText(MainActivity.this, "开始导航...", Toast.LENGTH_SHORT).show();
Intent intent = new Intent();
intent.setClass(MainActivity.this, BNaviGuideActivity.class);
startActivity(intent);
}
@Override
public void onRoutePlanFail(BikeRoutePlanError bikeRoutePlanError) {
}
});
}
//添加覆盖物
private void addMyLocation() {
mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(mCrrentMode, true, mCurrentMarker));
mBaiduMap.clear();
LatLng point = new LatLng(latitude, longitude);
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
OverlayOptions option = new MarkerOptions()
.position(point)
.icon(bitmap);
mBaiduMap.addOverlay(option);
}
//计算定位
private void addCircleOverlay() {
if (isShowOverlay == 1) {
mBaiduMap.clear();
isShowOverlay = 0;
LatLng pt = new LatLng(latitude, longitude);
CircleOptions circleoptions = new CircleOptions();
circleoptions.center(pt);
circleoptions.fillColor(0xAAFFFF00);
circleoptions.radius(250);
circleoptions.stroke(new Stroke(5, 0xAA00FF00));
mBaiduMap.addOverlay(circleoptions);
} else {
mBaiduMap.clear();
isShowOverlay = 1;
}
}
//定位需要的类
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
Toast.makeText(MainActivity.this, "正在定位...", Toast.LENGTH_SHORT).show();
if (location == null || mBaiduMap == null) {
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
.direction(100)
.latitude(location.getLatitude())
.longitude(location.getLongitude())
.build();
mBaiduMap.setMyLocationData(locData);
mCrrentMode = MyLocationConfiguration.LocationMode.NORMAL;
//获取本身坐标点
latitude = location.getLatitude();
longitude = location.getLongitude();
if (isFirstLoc) {
isFirstLoc = false;
LatLng loc = new LatLng(location.getLatitude(), location.getLongitude());
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(loc);
mBaiduMap.animateMapStatus(msu);
Toast.makeText(getApplicationContext(), location.getAddrStr(),
Toast.LENGTH_SHORT).show();
}
}
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocClient.stop();
mBaiduMap.setMyLocationEnabled(false);
mMap.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
mMap.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMap.onPause();
}
//POI检索需要的监听
class MyPoiListener implements OnGetPoiSearchResultListener {
@Override
public void onGetPoiResult(PoiResult poiResult) {
if (poiResult == null
|| SearchResult.ERRORNO.RESULT_NOT_FOUND == poiResult.error) {
Toast.makeText(getApplicationContext(), "未查询到结果", Toast.LENGTH_SHORT).show();
return;
}
String text = "共" + poiResult.getTotalPageNum() + "页,共"
+ poiResult.getTotalPoiNum() + "条,当前第"
+ poiResult.getCurrentPageNum() + "页,当前页共"
+ poiResult.getCurrentPageCapacity() + "条";
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
mBaiduMap.clear();// 清除上一次的数据
// 创建覆盖物
PoiOverlay poiOverlay = new MyPoiOverlay(mBaiduMap);
mBaiduMap.setOnMarkerClickListener(poiOverlay);
// 设置数据
poiOverlay.setData(poiResult);// 只是把当前页的数据显示出来
// 添加到地图上
poiOverlay.addToMap();
poiOverlay.zoomToSpan();// 缩放地图,使所有Overlay都在合适的视野内
}
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
if (poiDetailResult == null
|| SearchResult.ERRORNO.RESULT_NOT_FOUND == poiDetailResult.error) {
Toast.makeText(getApplicationContext(), "未查询到结果", Toast.LENGTH_SHORT).show();
return;
}
String text = "当前位置为"+poiDetailResult.getAddress() + ":" + poiDetailResult.getFavoriteNum();
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
}
}
//POI检索需要的PoiOverlay类
class MyPoiOverlay extends PoiOverlay {
/**
* 构造函数
*
* @param baiduMap 该 PoiOverlay 引用的 BaiduMap 对象
*/
public MyPoiOverlay(BaiduMap baiduMap) {
super(baiduMap);
}
@Override
public boolean onPoiClick(int i) {
PoiResult poiResult = getPoiResult();
List<PoiInfo> allPoi = poiResult.getAllPoi();// 获取返回来的所有POI
PoiInfo poiInfo = allPoi.get(i);
String text = poiInfo.city + ":" + poiInfo.address;
double latitude1 = poiInfo.location.latitude;
double longitude1 = poiInfo.location.longitude;
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
PoiDetailSearchOption option = new PoiDetailSearchOption();
option.poiUid(poiInfo.uid);// 设置poi uid
poiSearch.searchPoiDetail(option);
kongzhi(latitude1, longitude1);
return super.onPoiClick(i);
}
}
}
import android.os.Bundle;
百度地图POI+覆盖物+导航 实现
最新推荐文章于 2024-02-21 15:28:34 发布