最近写了百度地图的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)); }