最近寫了百度地圖的Demo,所以總結下遇到的問題;
1.首先在百度地圖中創建應用時用到 發布版SHA1是在Preferences下的Android下的Build中;
2.在使用百度地圖時,先要創建一個Application的類,中間引用 SDKInitializer.initialize(this)// 在使用 SDK 各組間之前初始化 context 信息,傳入 ApplicationContext;
3.在清單文件中配置應用的權限及配置com.baidu.lbsapi.API_KEY;
4.使用時候將你用到的jar包添加上,離線包需要的添加上;
如下是我寫的例子的2個效果圖:
一共是3個小例子:定位自己,添加marker,和軌跡;
在寫的時候一共遇到2個問題:
1.在使用定位的時候,忘了加定位的離線包,所以一直定位到大西洋,定位錯誤;
2.在添加軌跡的時候,我使用模擬器的時候,一直蹦潰沒有處理好,但是用真機時候又可以了。
如下是代碼下載鏈接:http://download.csdn.net/detail/qq_29774291/9718205
如下是主要代碼:
package com.item.baidu; import java.util.ArrayList; import java.util.List; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener; import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.GroundOverlayOptions; import com.baidu.mapapi.map.InfoWindow; 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.OverlayOptions; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.model.LatLngBounds; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.TextView; /** * 添加自定義的mark * * @author Administrator * */ public class MyMarkActivity extends Activity { private MapView mMapView; private BaiduMap mBaiduMap; private List<Bean> mapBeans; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_mark); mMapView = (MapView)findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(13.0f); mBaiduMap.setMapStatus(msu); mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { // TODO Auto-generated method stub final Bean beans = (Bean)marker.getExtraInfo().get("BEAN"); View markView = View.inflate(getApplicationContext(), R.layout.item_maker, null); TextView tv_id = (TextView)markView.findViewById(R.id.mark_id); TextView tv_number = (TextView)markView.findViewById(R.id.mark_carnumber); TextView tv_speed = (TextView)markView.findViewById(R.id.mark_speed); tv_id.setText(beans.getId() + ""); tv_number.setText("車 牌 號:" + beans.getNumber()); tv_speed.setText("當前車速:" + beans.getSpeed() + " km/h"); OnInfoWindowClickListener listener = null; listener = new OnInfoWindowClickListener() { @Override public void onInfoWindowClick() { // TODO Auto-generated method stub Intent intent = new Intent(MyMarkActivity.this,TrackActivity.class); intent.putExtra("bean", beans); startActivity(intent); mBaiduMap.hideInfoWindow(); } }; LatLng ll = marker.getPosition(); InfoWindow mInfoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(markView), ll, -47, listener); mBaiduMap.showInfoWindow(mInfoWindow); return true; } }); initData(); } /** * 添加幾個數據 */ BitmapDescriptor bdGround = BitmapDescriptorFactory.fromResource(R.drawable.ground_overlay); private void initData() { // TODO Auto-generated method stub //設置中心點 LatLng southwest = new LatLng(39.92235, 116.380338); LatLng northeast = new LatLng(39.947246, 116.414977); LatLngBounds bounds = new LatLngBounds.Builder().include(northeast).include(southwest).build(); OverlayOptions ooGround = new GroundOverlayOptions().positionFromBounds(bounds).image(bdGround).transparency(0.7f); mBaiduMap.addOverlay(ooGround); //添加marker mapBeans = new ArrayList<Bean>(); mapBeans.add(new Bean(1, "皖111111", "111", 30.82943, 116.89586)); mapBeans.add(new Bean(2, "皖222222", "222", 39.942821, 116.369199)); mapBeans.add(new Bean(3, "皖333333", "333", 39.939723, 116.425541)); mapBeans.add(new Bean(4, "皖444444", "444", 39.906965, 116.401394)); mapBeans.add(new Bean(5, "皖555555", "555", 39.82943, 116.42586)); mapBeans.add(new Bean(6, "皖666666", "666", 38.92943,116.89586)); mapBeans.add(new Bean(7, "皖777777", "777", 39.92235, 116.414977)); mapBeans.add(new Bean(8, "皖888888", "888", 39.947246, 116.89586)); for(Bean bean : mapBeans){ LatLng latLng = new LatLng(bean.getLatitude(), bean.getLongitude()); Bundle bundle = new Bundle(); bundle.putSerializable("BEAN", bean); View view = View.inflate(getApplicationContext(), R.layout.item_bean, null); TextView tView = (TextView)view.findViewById(R.id.item_bean); tView.setText(bean.getId() + ""); //將View轉化為Bitmap BitmapDescriptor descriptor = BitmapDescriptorFactory.fromView(view); OverlayOptions options = new MarkerOptions().position(latLng).icon(descriptor).extraInfo(bundle).zIndex(9).draggable(true); mBaiduMap.addOverlay(options); } } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); mMapView.onResume(); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); mMapView.onPause(); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); mMapView.onDestroy(); mBaiduMap = null; bdGround.recycle(); } }
定位的代碼
package com.item.baidu; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapStatus; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.model.LatLng; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; /** * 定位自己 * * @author Administrator * */ public class MyOptionActivity extends Activity { private TextView tv_option; private MapView mMapView; private BaiduMap mBaiduMap; //定位相關 private LocationClient mLocClient; private boolean isFirstLoc = true;//是否首次定位 private MyLocationListenner myListener = new MyLocationListenner(); @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_option); tv_option = (TextView) findViewById(R.id.tv_option); mMapView = (MapView) findViewById(R.id.map_option); mBaiduMap = mMapView.getMap(); MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(13.0f); mBaiduMap.setMapStatus(msu); //開啟定位圖層 mBaiduMap.setMyLocationEnabled(true); //定位初始化 mLocClient = new LocationClient(getApplicationContext()); mLocClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);// 打開GPS option.setCoorType("bd09ll");//設置坐標類型 option.setScanSpan(10000);//設置掃描間隔,單位是毫秒 當<1000(1s)時,定時定位無效 option.setIsNeedAddress(true);//設置地址信息,默認無地址信息 mLocClient.setLocOption(option); mLocClient.start(); } /** * 定位SDK監聽函數 */ private class MyLocationListenner implements BDLocationListener{ @Override public void onReceiveLocation(BDLocation location) { // TODO Auto-generated method stub // map view 銷毀后不在處理新接收的位置 if (location == null || mMapView == null) { return; } MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) // 此處設置開發者獲取到的方向信息,順時針0-360 .direction(100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(),location.getLongitude()); tv_option.setText(ll +"詳情地點:" + location.getAddrStr() + " 城市:" +location.getCity()); MapStatus.Builder builder = new MapStatus.Builder(); builder.target(ll).zoom(18.0f); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); } } } @Override protected void onPause() { // MapView的生命周期與Activity同步,當activity掛起時需調用MapView.onPause() mMapView.onPause(); super.onPause(); } @Override protected void onResume() { // MapView的生命周期與Activity同步,當activity恢復時需調用MapView.onResume() mMapView.onResume(); super.onResume(); } @Override protected void onDestroy() { // 退出時銷毀定位 mLocClient.stop(); // 關閉定位圖層 mBaiduMap.setMyLocationEnabled(false); // MapView的生命周期與Activity同步,當activity銷毀時需調用MapView.destroy() mMapView.onDestroy(); mMapView = null; super.onDestroy(); } }
軌跡
private void initData() { // TODO Auto-generated method stub Intent intent = getIntent(); Bean bean = (Bean)intent.getSerializableExtra("bean"); tv_bean.setText(bean.getNumber() + ""); initTrack(); //設置開始的坐標為地圖中心點 mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(pointLngs.get(0))); //添加開始的圖標 mBaiduMap.addOverlay(new MarkerOptions().position(pointLngs.get(0)) .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_start))); //添加結束的圖標 mBaiduMap.addOverlay(new MarkerOptions().position(pointLngs.get(pointLngs.size()-1)) .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_end))); //描線 mBaiduMap.addOverlay(new PolylineOptions().width(8).color(Color.rgb(0,255,0)) .points(pointLngs).dottedLine(true)); }