慕課視頻:Android-百度地圖之導(dǎo)航
http://www.imooc.com/learn/670
Android 百度地圖 SDK v3.0.0
轉(zhuǎn)載鏈接【鴻神】:http://blog.csdn.net/lmj623565791/article/category/2392939
Android:百度地圖 點聚合功能
http://m.blog.csdn.net/article/details?id=52386097
百度地圖應(yīng)用實例操作
http://m.blog.csdn.net/blog/index?username=rt77777
android 獲取GPS經(jīng)緯度在百度地圖上繪制軌跡
http://m.blog.csdn.net/article/details?id=17842697
百度地圖應(yīng)用實例
http://www.reibang.com/p/ade5f2a7f320
Android地圖開發(fā)
http://blog.csdn.net/column/details/android-jacksen-map.html
百度地圖開發(fā)之實現(xiàn)運動軌跡 <一>
http://blog.csdn.net/u013430507/article/details/44064761
百度地圖開發(fā)之實現(xiàn)運動軌跡 <二>
http://blog.csdn.net/u013430507/article/details/44065409
Android 百度地圖 SDK v3.0.0 (二) 定位與結(jié)合方向傳感器
http://blog.csdn.net/u013430507/article/details/44065765
百度地圖開發(fā)文檔地址
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/hellobaidumap
程序包api文檔
http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v4_3_0/index.html
《一》生成SHA1時注意:
keytool的使用:目錄下的keytool全路名
dubug版:keytool -list -v -keystore debug.keystore
注意:debug.keystore(默認沒有口令)
上線版:keytool -list -v -keystore 123.jks
口令就是keystore的密碼
《二》復(fù)制jar包
(1)直接復(fù)制BaiduMap_AndroidSDK_v4.2.1_Sample\BaiduMapsApiDemo\libs
目錄下的jar包《除去v4》
(2) 生成并粘貼main/jniLibs下面的so文件(5個)
《三》配置功能清單文件
權(quán)限以及《meta-data》替換成自己應(yīng)用生成的value值(key)
《四》布局layout中添加map組件
《五》添加圖層
獲取地圖的實例
//添加交通圖
mapView.setTrafficEnabled(true);
//mapView.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
/* //普通地圖
mapView.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//衛(wèi)星地圖
mapView.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
//空白地圖, 基礎(chǔ)地圖瓦片將不會被渲染菇爪。在地圖類型中設(shè)置為NONE撒强,將不會使用流量下載基礎(chǔ)地圖瓦片圖層爆土。
// 使用場景:與瓦片圖層一起使用疟位,節(jié)省流量晦譬,提升自定義瓦片圖下載速度锻煌。
mapView.setMapType(BaiduMap.MAP_TYPE_NONE);
//開啟交通圖 實時交通圖
mapView.setTrafficEnabled(true);
//開啟交通圖 百度城市熱力圖
mapView.setBaiduHeatMapEnabled(true);
《六》添加覆蓋物
//設(shè)置地圖點擊事件
mapView.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {//坐標(biāo)
mapView.clear();//清除地圖上的所有的覆蓋物
//創(chuàng)建一個覆蓋物的圖標(biāo)
BitmapDescriptor icon = BitmapDescriptorFactory
.fromResource(R.mipmap.ic_launcher);
//創(chuàng)建一個覆蓋物
OverlayOptions options =
new MarkerOptions().position(latLng).icon(icon);
//將覆蓋物添加到地圖中
mapView.addOverlay(options);
}
@Override
public boolean onMapPoiClick(MapPoi mapPoi) {
return false;
}
});
《七》添加覆蓋物的點擊事件
mapView.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
Toast.makeText(MainActivity.this, "別點我討厭X宰稹酌伊!", Toast.LENGTH_SHORT).show();
return false;
}
});
完整代碼:
public class MainActivity extends AppCompatActivity {
private BaiduMap mapView;
private MapView map;
private PoiSearch poiSearch;
private ShareUrlSearch shareUrlSearch;
private RoutePlanSearch routePlanSearch;
private GeoCoder geoCoder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各組件之前初始化context信息漫萄,傳入ApplicationContext
//注意該方法要再setContentView方法之前實現(xiàn)
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
initView();
initListener();
}
private void initListener() {
//添加地圖的事件
//initMapListener();
//添加marker點擊事件
//initMarkerListener();
//檢索監(jiān)聽
initPoiListener();
//設(shè)置分享監(jiān)聽
initShareListener();
//創(chuàng)建線路規(guī)劃監(jiān)聽
initRoutePlanListener();
//地理編碼
initGeoCoderListener();
}
private void initGeoCoderListener() {
geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
Log.i("TAG", "onGetGeoCodeResult: "+geoCodeResult.getLocation().toString());
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
String address = reverseGeoCodeResult.getAddress();
Log.i("TAG", "onGetGeoCodeResult: ");
}
});
}
private void initRoutePlanListener() {
routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {
@Override
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
//步行路線結(jié)果回調(diào)
if (walkingRouteResult == null ||
walkingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
return;
}
mapView.clear();
WalkingRouteOverlay overly = new MyWalk(mapView);
overly.setData(walkingRouteResult.getRouteLines().get(0));
overly.addToMap();
overly.zoomToSpan();
}
@Override
public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
//換乘路線結(jié)果回調(diào)
}
@Override
public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {
//跨城公共交通路線結(jié)果回調(diào)
}
@Override
public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
//駕車路線結(jié)果回調(diào)
//騎行路線回調(diào)
if (drivingRouteResult == null ||
drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
return;
}
mapView.clear();
DrivingRouteOverlay overlay = new MyDriver(mapView);
overlay.setData(drivingRouteResult.getRouteLines().get(0));
overlay.addToMap();
overlay.zoomToSpan();
}
@Override
public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {
//室內(nèi)路線規(guī)劃回調(diào)
}
@Override
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
//騎行路線結(jié)果回調(diào)
if (bikingRouteResult == null ||
bikingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
return;
}
mapView.clear();
BikingRouteOverlay overlay = new MyBinking(mapView);
overlay.setData(bikingRouteResult.getRouteLines().get(0));
overlay.addToMap();
overlay.zoomToSpan();
}
});
}
//創(chuàng)建步行路線覆蓋物
class MyWalk extends WalkingRouteOverlay {
public MyWalk(BaiduMap baiduMap) {
super(baiduMap);
}
@Override
public boolean onPolylineClick(Polyline polyline) {
return super.onPolylineClick(polyline);
}
}
//創(chuàng)建架車路線覆蓋物
class MyDriver extends DrivingRouteOverlay {
public MyDriver(BaiduMap baiduMap) {
super(baiduMap);
}
}
//創(chuàng)建步行路線覆蓋物
class MyBinking extends BikingRouteOverlay {
public MyBinking(BaiduMap baiduMap) {
super(baiduMap);
}
}
//=======分享的第二個回調(diào)(shareUrl)==>url=====
private void initShareListener() {
shareUrlSearch.setOnGetShareUrlResultListener(
new OnGetShareUrlResultListener() {
@Override
public void onGetPoiDetailShareUrlResult(final ShareUrlResult shareUrlResult){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,
""+shareUrlResult.getUrl(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onGetLocationShareUrlResult(ShareUrlResult shareUrlResult) {
}
@Override
public void onGetRouteShareUrlResult(ShareUrlResult shareUrlResult) {
}
});
}
//=============poi檢索監(jiān)聽==============
private void initPoiListener() {
poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
//獲取POI檢索結(jié)果
@Override
public void onGetPoiResult(PoiResult poiResult) {
//判斷是否有結(jié)果
if (poiResult == null || poiResult.error != SearchResult.ERRORNO.NO_ERROR) {
Log.v("TAG", "沒有找到相關(guān)搜索");
return;
}
//獲取檢索結(jié)果集
List<PoiInfo> list = poiResult.getAllPoi();
for (PoiInfo info : list) {
Log.i("TAG", "onGetPoiResult: " + info.name);
//添加標(biāo)注物
/* BitmapDescriptor bitmapDescriptor
= BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
OverlayOptions options = new MarkerOptions().position(info.location)
.icon(bitmapDescriptor);
mapView.addOverlay(options);*/
//添加系統(tǒng)提供的標(biāo)注物
mapView.clear();
MyOverly myOverly = new MyOverly(mapView);
myOverly.setData(poiResult);
myOverly.addToMap();
myOverly.zoomToSpan(); //自動放大
mapView.setOnMarkerClickListener(myOverly);
}
}
//poi搜索的回調(diào)詳情 點擊的時候調(diào)用此方法
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
//=======分享的第一個回調(diào)poi(PoiInfo)==》request(shareUrl)=====
shareUrlSearch.requestPoiDetailShareUrl(
new PoiDetailShareURLOption()
.poiUid(poiDetailResult.getUid()));
/*shareUrlSearch.requestLocationShareUrl(
new LocationShareURLOption()
.location(poiDetailResult.getLocation())
.name("aaa").snippet("bbb"));*/
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
}
});
}
class MyOverly extends PoiOverlay {
/**
* 構(gòu)造函數(shù)
*
* @param baiduMap 該 PoiOverlay 引用的 BaiduMap 對象
*/
public MyOverly(BaiduMap baiduMap) {
super(baiduMap);
}
@Override
public boolean onPoiClick(int i) {
List<PoiInfo> allPoi = getPoiResult().getAllPoi();
Toast.makeText(MainActivity.this,
"" + allPoi.get(i).name, Toast.LENGTH_SHORT).show();
//
poiSearch.searchPoiDetail(
new PoiDetailSearchOption().poiUid(allPoi.get(i).uid));
return super.onPoiClick(i);
}
}
private void initMarkerListener() {
mapView.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
Toast.makeText(MainActivity.this, "別點我討厭>碓薄!", Toast.LENGTH_SHORT).show();
return false;
}
});
}
private void initMapListener() {
//設(shè)置地圖點擊事件
mapView.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {//坐標(biāo)
mapView.clear();//清除地圖上的所有的覆蓋物
//創(chuàng)建一個覆蓋物的圖標(biāo)
BitmapDescriptor icon = BitmapDescriptorFactory
.fromResource(R.mipmap.ic_launcher);
//創(chuàng)建一個覆蓋物
OverlayOptions options =
new MarkerOptions().position(latLng).icon(icon);
//將覆蓋物添加到地圖中
mapView.addOverlay(options);
}
@Override
public boolean onMapPoiClick(MapPoi mapPoi) {
return false;
}
});
}
private void initView() {
map = (MapView) findViewById(R.id.mapview);
//獲取當(dāng)前的地圖
mapView = map.getMap();
//初始化POI檢索
poiSearch = PoiSearch.newInstance();
//初始化分享
shareUrlSearch = ShareUrlSearch.newInstance();
//創(chuàng)建線路規(guī)劃的實例
routePlanSearch = RoutePlanSearch.newInstance();
//地理編碼
//地理編碼
geoCoder = GeoCoder.newInstance();
}
/*
*
* 添加圖層
*
* */
public void btn1(View view) {
//添加交通圖
mapView.setTrafficEnabled(true);
//mapView.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
/* //普通地圖
mapView.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//衛(wèi)星地圖
mapView.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
//空白地圖, 基礎(chǔ)地圖瓦片將不會被渲染腾务。在地圖類型中設(shè)置為NONE毕骡,將不會使用流量下載基礎(chǔ)地圖瓦片圖層。
// 使用場景:與瓦片圖層一起使用岩瘦,節(jié)省流量未巫,提升自定義瓦片圖下載速度。
mapView.setMapType(BaiduMap.MAP_TYPE_NONE);
//開啟交通圖 實時交通圖
mapView.setTrafficEnabled(true);
//開啟交通圖 百度城市熱力圖
mapView.setBaiduHeatMapEnabled(true);*/
}
/*
* 添加覆蓋物
*
* */
public void btn2(View view) {
//添加Marker
/* //經(jīng)緯度
LatLng l = new LatLng(39.963175,116.400244);
//創(chuàng)建一個覆蓋物的圖標(biāo)
BitmapDescriptor icon = BitmapDescriptorFactory
.fromResource(R.mipmap.ic_launcher);
//創(chuàng)建一個覆蓋物
OverlayOptions options = new MarkerOptions().position(l).icon(icon);
//將覆蓋物添加到地圖中
mapView.addOverlay(options);*/
//添加幾何圖形
//添加一個幾何圖形
LatLng l1 = new LatLng(39.93925, 116.357428);
LatLng l2 = new LatLng(39.90925, 116.327428);
LatLng l3 = new LatLng(39.88925, 116.347428);
//將三個坐標(biāo)添加到集合中
List<LatLng> pt = new ArrayList<>();
pt.add(l1);
pt.add(l2);
pt.add(l3);
OverlayOptions options = new PolygonOptions().points(pt)
//2 邊寬 和邊的顏色 启昧, fillColor(填充的顏色)
.stroke(new Stroke(2, 0xAA00FF00)).fillColor(0xAA00FF00);
mapView.addOverlay(options);
}
/*
* POI檢索
*
* */
public void btn3(View view) {
//城市內(nèi)檢索
/*
PoiCitySearchOption city(java.lang.String city)
檢索城市
PoiCitySearchOption keyword(java.lang.String key)
搜索關(guān)鍵字
PoiCitySearchOption pageCapacity(int pageCapacity)
設(shè)置每頁容量叙凡,默認為每頁10條
PoiCitySearchOption pageNum(int pageNum)
分頁編號
*/
/*poiSearch.searchInCity(
new PoiCitySearchOption().city("北京")
.keyword("ATM").pageNum(1).pageCapacity(10));*/
/**
keyword(java.lang.String key)
檢索關(guān)鍵字
PoiNearbySearchOption location(LatLng location)
檢索位置
PoiNearbySearchOption pageCapacity(int pageCapacity)
設(shè)置每頁容量,默認為每頁10條
PoiNearbySearchOption pageNum(int pageNum)
分頁編號
PoiNearbySearchOption radius(int radius)
設(shè)置檢索的半徑范圍
PoiNearbySearchOption sortType(PoiSortType sortType)
搜索結(jié)果排序規(guī)則密末,可選握爷,默認
*/
//周邊檢索,有一個中心點
LatLng l1 = new LatLng(39.93925, 116.357428);
poiSearch.searchNearby(new PoiNearbySearchOption()
.radius(10000).pageCapacity(10).pageNum(1).location(l1).keyword("美食"));
}
/*
* 路線規(guī)劃
* */
public void btn4(View view){
//路線 第一個參數(shù)是cityCode
第二個是具體地址
PlanNode stNode = PlanNode.withCityCodeAndPlaceName(132, "xxxx");
PlanNode endNode = PlanNode.withCityCodeAndPlaceName(132, "xxxx");
// routePlanSearch.transitSearch(new TransitRoutePlanOption()
// .city("北京").from(stNode).to(endNode));
routePlanSearch.drivingSearch(new DrivingRoutePlanOption()
.from(stNode).to(endNode));
// routePlanSearch.bikingSearch(new BikingRoutePlanOption().from(stNode).to(endNode));
}
/*
* 地理編碼
* */
public void btn5(View view){
//將經(jīng)緯度轉(zhuǎn)找成地址
geoCoder.reverseGeoCode(new ReverseGeoCodeOption()
.location(new LatLng(39.946758,116.423134)));
//將地址轉(zhuǎn)換成經(jīng)緯度
// geoCoder.geocode(new GeoCodeOption()
// .address("北京").city("北京"));
}
public void btn6(View view){
onCreate();
}
public void btn7(View view){
//開啟定位圖層
mapView.setMyLocationEnabled(true);
}
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
public void onCreate() {
mLocationClient = new LocationClient(getApplicationContext());
//聲明LocationClient類
mLocationClient.registerLocationListener( myListener );
//注冊監(jiān)聽函數(shù)
initLocation();
mLocationClient.start(); //開啟定位
}
/*
* 設(shè)置locationClient的參數(shù)
*
* */
private void initLocation(){
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可選严里,默認高精度新啼,設(shè)置定位模式,高精度刹碾,低功耗燥撞,僅設(shè)備
option.setCoorType("bd09ll");
//可選,默認gcj02迷帜,設(shè)置返回的定位結(jié)果坐標(biāo)系
int span=1000;
option.setScanSpan(span);
//可選叨吮,默認0,即僅定位一次瞬矩,設(shè)置發(fā)起定位請求的間隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);
//可選茶鉴,設(shè)置是否需要地址信息,默認不需要
option.setOpenGps(true);
//可選景用,默認false,設(shè)置是否使用gps
option.setLocationNotify(true);
//可選涵叮,默認false惭蹂,設(shè)置是否當(dāng)GPS有效時按照1S/1次頻率輸出GPS結(jié)果
option.setIsNeedLocationDescribe(true);
//可選,默認false割粮,設(shè)置是否需要位置語義化結(jié)果盾碗,可以在BDLocation.getLocationDescribe里得到,結(jié)果類似于“在北京天安門附近”
option.setIsNeedLocationPoiList(true);
//可選舀瓢,默認false廷雅,設(shè)置是否需要POI結(jié)果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);
//可選京髓,默認true航缀,定位SDK內(nèi)部是一個SERVICE,并放到了獨立進程堰怨,設(shè)置是否在stop的時候殺死這個進程芥玉,默認不殺死
option.SetIgnoreCacheException(false);
//可選,默認false备图,設(shè)置是否收集CRASH信息灿巧,默認收集
option.setEnableSimulateGps(false);
//可選,默認false揽涮,設(shè)置是否需要過濾GPS仿真結(jié)果抠藕,默認需要
mLocationClient.setLocOption(option);
}
/*
* 獲取定位的信息
* */
private boolean isFirst = true;
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
//獲取定位結(jié)果
/* StringBuffer sb = new StringBuffer(256);
sb.append("time : ");
sb.append(location.getTime()); //獲取定位時間
sb.append(location.getAddrStr());
String s = sb.toString();
Log.i("BaiduLocationApiDem", sb.toString());*/
// 構(gòu)造定位數(shù)據(jù)
MyLocationData locData = new MyLocationData.Builder()
//設(shè)置精確度
.accuracy(location.getRadius())
// 此處設(shè)置開發(fā)者獲取到的方向信息,順時針0-360
.direction(100)
//設(shè)置緯度
.latitude(location.getLatitude())
//設(shè)置經(jīng)度
.longitude(location.getLongitude())
.build();
// 設(shè)置定位數(shù)據(jù)
mapView.setMyLocationData(locData);
if (isFirst){
isFirst = false; //只會在第一次更新的時候才更新
LatLng lat = new LatLng(location.getLatitude(),
location.getLongitude());
//第一個參數(shù)是坐標(biāo)蒋困,第二個參數(shù)是縮放值
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(lat,13);
mapView.animateMapStatus(mapStatusUpdate);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
map.onDestroy();
poiSearch.destroy();
}
@Override
protected void onPause() {
super.onPause();
map.onPause();
}
@Override
protected void onResume() {
super.onStop();
map.onResume();
}
}
開發(fā)中坑:
《坑一》安全碼校驗 MCodeCheck.apk幢痘,解決地圖不出現(xiàn)的原因
安全碼校驗是真實運行的SAH1,需要把創(chuàng)建應(yīng)用的SAH1覆蓋家破,地圖就會顯示
注冊配置的SHA1和運行的應(yīng)用的SAH1必須保持一致颜说,地圖才會出現(xiàn)
《坑二》參考:http://blog.csdn.net/taoolee/article/details/49361569
java.lang.IllegalArgumentException: No config chosen
異常的原因是SDK找不到支持OPENGL的硬件.從論壇得知,用戶鉤選了Use Host Gup 選項汰聋,此選項是說模擬器使用用戶物理機上的GPU门粪。如果用戶物理機沒有獨立顯卡,就會報錯烹困,此種情況下不鉤這個選項就可以了玄妈。模擬器設(shè)置問題,與sdk沒關(guān)系.
直白點就是模擬器不行: 需要真機測試
《坑三》6.0 動態(tài)申請定位權(quán)限