以百度api为基础
复制
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />
要定义的变量
private BaiduMap mBaiduMap; private MapView mMapView; private LocationClient mLocationClient; private boolean isFirstIn = true;
初始化
mMapView= (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap();
各部分实现的功能
1.
//在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext());
把地图的生命周期和activity的生命周期绑定起来
@Override protected void onStart() { super.onStart(); mBaiduMap.setMyLocationEnabled(true); if(!mLocationClient.isStarted()) mLocationClient.start(); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); }
实现option点击转换地图模式
@Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub menu.add(0, 1, 0, "普通地图"); menu.add(0, 2, 0, "卫星地图"); menu.add(0, 3, 0, "实时交通(off)"); return super.onCreateOptionsMenu(menu); }
设置option的点击事件
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 1: //普通地图 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); break; case 2: //卫星地图 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); break; case 3: if(mBaiduMap.isTrafficEnabled()){ mBaiduMap.setTrafficEnabled(false); item.setTitle("实时交通(off)"); }else{ mBaiduMap.setTrafficEnabled(true); item.setTitle("实时交通(on)"); } break; } return super.onOptionsItemSelected(item); }
在地图上添加标识物
//定义Maker坐标点 LatLng point = new LatLng(39.963175, 116.400244); //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory .fromResource(R.drawable.ic_launcher); //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions() .position(point) .icon(bitmap); //在地图上添加Marker,并显示 mBaiduMap.addOverlay(option);
设置gps定位
要用到的类
LocationClient
BDLocationListener
(1)
MyLocationListener myLocationListener = new MyLocationListener(); mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类 mLocationClient.registerLocationListener(myLocationListener); //注册监听函数
(2)利用LocationClientOption 设置定位的属性
LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式 option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02 option.setScanSpan(1000);//设置发起定位请求的间隔时间为5000ms option.setIsNeedAddress(true);//返回的定位结果包含地址信息 option.setNeedDeviceDirect(true);//返回的定位结果包含手机机头的方向 mLocationClient.setLocOption(option);
(3)监听器的实现
private class MyLocationListener implements BDLocationListener{ @Override public void onReceiveLocation(BDLocation location) { // TODO Auto-generated method stub MyLocationData data = new MyLocationData.Builder() //设置经纬度 .accuracy(location.getRadius()) .latitude(location.getLatitude()) .longitude(location.getLongitude()) .build(); mBaiduMap.setMyLocationData(data); //判断第一次进入,定位到目前所在位置 if(isFirstIn){ LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate msu =MapStatusUpdateFactory.newLatLng(latLng); mBaiduMap.animateMapStatus(msu); Toast.makeText(getApplicationContext(), location.getAddrStr(),3000).show(); isFirstIn = false; } } }
所要加的权限
<!-- 这个权限用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission><!-- 这个权限用于访问GPS定位--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission><!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><!-- 获取运营商信息,用于支持提供运营商信息相关的接口--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission><!-- 用于读取手机当前的状态--><uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission><!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><!-- 访问网络,网络定位需要上网--><uses-permission android:name="android.permission.INTERNET" /><!-- SD卡读取权限,用户写入离线定位数据--><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission><!--允许应用读取低级别的系统日志文件 --><uses-permission android:name="android.permission.READ_LOGS"></uses-permission> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" />
所要在application声明的
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="OSzBVaOV08hT2o7yNBIq4NFS" /> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>