Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!
2023-09-14 08:59:39 时间
或者出一些装ubuntu系统或者黑苹果教程什么的,或者5.X之后的新玩法,主要还是困于时间方面缺少,或许这也是一种锻炼吧,工作了挺久的了,越发觉得自己的JAVA基础实在是烂的可以,想去买一本JAVA的书籍啃一啃,刚好年假也有15天,这都是后话了,我们言归正传,今天分析的是百度地图的sdk怎么去使用,包括他的几个类的详细说明,可能写得快的话半个礼拜就写完了就会加上高德地图什么的,不过看现在公司项目的样子,一天能写一个小时就不错了
第一步:在工程app/libs目录下放入baidumapapi_vX_X_X.jar包,在src/main/目录下新建jniLibs目录,放入libBaiduMapSDK_vX_X_X_X.so如下图所示,注意jar和so的前3位版本号必须一致,并且保证使用一次下载的文件夹中的两个文件,不能不同功能组件的jar或so交叉使用。 第二步:导入jar包。菜单栏选择File- Project Structor- Modules- Dependencies,点击+号,选择File dependency,选择jar包导入。 通过以上两步操作后,您就可以正常使用百度地图SDK为您提供的全部功能了。
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.WAKE_LOCK" / uses-permission android:name="android.permission.CHANGE_WIFI_STATE" / uses-permission android:name="android.permission.ACCESS_WIFI_STATE" / uses-permission android:name="android.permission.GET_TASKS" / uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" / uses-permission android:name="android.permission.WRITE_SETTINGS" /
在应用程序创建时初始化 SDK引用的Context 全局变量: 记住,一定要再setContentView之前执行 并且初始化mapview
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); mMapView = (MapView) findViewById(R.id.bmapView); }
super.onDestroy(); // 在activity执行onDestroy时执行mMapView.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(); }
——MapView的MKMapViewListener //控件的点击事件 3.MapController //地图控制,必须MapViewy已经存在 //控制地图平移,缩放,选择等..
我们做这种类型的应用,一般也就两个交互,一个就是key的授权,还有一个就是网络的授权了,我们我们在开始实现地图功能之前应该先去判断一下这两个条件是否实现了
public void onReceive(Context context, Intent intent) { String action = intent.getAction(); // 网络错误 if (action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) { Toast.makeText(MainActivity.this, "无法连接网络", Toast.LENGTH_SHORT).show(); // key效验失败 } else if(action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) { Toast.makeText(MainActivity.this, "百度地图key效验失败",Toast.LENGTH_SHORT).show(); }
// 网络错误 filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR); // 效验key失败 filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR); registerReceiver(receiver, filter);
逻辑就是当进入应用的时候sdk会去验证这两个条件,如果发现网络错误或者验证Key失败就会发送一条广播,广播接收者接收到了这条广播之后弹出一个Toast,当然,你如果想人性化一点也可以弹一个Dialog,这里作为demo就不做这么复杂的东西了
//key效验失败 SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR
虽然地图上是有按钮可以进行缩放的,但是再某些场景还是需要我们人工缩放,但是再缩放之前,我们应该先来了解一下缩放级别 缩放级别在2.X是个分水岭,在2.X之前的级别是(3-18),之后是(3-19),主要是有两个区别 1.修改了文件格式,具体是啥也不需要懂,只要知道,比如深圳的地图100M,2.x之后只要15M左右就行了 2.增加了3D效果,这要在18或者19的级别上才可以看到 我们先把BaiduMap给实现了
private void init(){ //描述地图将要发生的变化,使用工厂类MapStatusUpdateFactory创建,设置级别 //为18,进去就是18了,默认是12 MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.zoomTo(18); mBaiduMap.setMapStatus(mapStatusUpdate); //是否显示缩放按钮 //mMapView.showZoomControls(false); }
你有没有发现,我们一进去地图显示的是北京天安门,其实这个就叫中心点,我们可以更改这个中心点 同样的,我们写一个方法在onCreate()中调用
//经纬度(纬度,经度) 我们这里设置深圳世界之窗的位置 LatLng latlng = new LatLng(22.5422870000,113.9804440000); MapStatusUpdate mapStatusUpdate_circle = MapStatusUpdateFactory.newLatLng(latlng); mBaiduMap.setMapStatus(mapStatusUpdate_circle); }
现在一进去中心点就会在世界之窗的坐标点了,我们定位的实现不就是获取到坐标点然后显示嘛!嘿嘿!
//放大缩放级别,每次放大一个级别 MapStatusUpdate bigStatus = MapStatusUpdateFactory.zoomIn(); mBaiduMap.setMapStatus(bigStatus); break; case KeyEvent.KEYCODE_2: //缩小缩放级别,每次缩小一个级别 MapStatusUpdate smallStatus = MapStatusUpdateFactory.zoomOut(); mBaiduMap.setMapStatus(smallStatus); break; case KeyEvent.KEYCODE_3: //以屏幕中心点旋转 MapStatus mapStatus = mBaiduMap.getMapStatus(); //获取当前地图的状态 float rotate = mapStatus.rotate; //获取旋转角度 Log.i("旋转角度", "rotate"+rotate); //用获取到的当前角度+30就是每次都旋转30° 范围0-360° MapStatus rotates =new MapStatus.Builder().rotate(rotate+30).build(); //更新地图的选择 MapStatusUpdate rotateStatus = MapStatusUpdateFactory.newMapStatus(rotates); mBaiduMap.setMapStatus(rotateStatus); break; case KeyEvent.KEYCODE_4: //以立体方式旋转 MapStatus mapStatusOver = mBaiduMap.getMapStatus(); //获取当前地图的状态 float overlook = mapStatusOver.overlook; //获取旋转角度 Log.i("旋转角度", "overlook"+overlook); //弧角范围:0-45° MapStatus overlooks =new MapStatus.Builder().overlook(overlook-5).build(); MapStatusUpdate overlookStatus = MapStatusUpdateFactory.newMapStatus(overlooks); mBaiduMap.setMapStatus(overlookStatus); break; case KeyEvent.KEYCODE_5: //移动 MapStatusUpdate moveStatus = MapStatusUpdateFactory.newLatLng(new LatLng(22.5422870000, 113.9804440000)); //带动画更新状态 默认300ms mBaiduMap.animateMapStatus(moveStatus); break; }
//设置地图双击监听 mBaiduMap.setOnMapDoubleClickListener(new OnMapDoubleClickListener() { @Override public void onMapDoubleClick(LatLng arg0) { // TODO Auto-generated method stub });
一个地图是由很多个图层包裹的,还有级别,这是由图块决定的,你所看到的房子,学校什么的都是由图层实现的
4、实时路况图图层(BaiduMap.setTrafficEnabled(true);); 5、百度城市热力图(BaiduMap.setBaiduHeatMapEnabled(true);); 6、底图标注(指的是底图上面自带的那些POI元素); 7、几何图形图层(点、折线、弧线、圆、多边形); 8、标注图层(Marker),文字绘制图层(Text); 9、指南针图层(当地图发生旋转和视角变化时,默认出现在左上角的指南针); 10、定位图层(BaiduMap.setMyLocationEnabled(true);); 11、弹出窗图层(InfoWindow); 12、自定义View(MapView.addView(View););
我们还是模拟操作,你也可以用Button点击事件去实现,这里就直接在onKeyDown()里面迷你按123键进行操作
有时候我们会发现,你身处的环境附近有一些小店铺是没有在地图上标记的,也有一些小店铺就被百度地图给标记了,这是为什么了?这其实是百度的一个特有的功能,也不是技术活,纯粹就是跟申请账号一样
首先我们打开百度地图的官网:http://map.baidu.com/
在最下方有个不起眼的文字,商户免费标注,点进去
按照这个步骤免费申请就得了,这里就不过多赘述
所有叠加或覆盖到地图的内容,我们统称为地图覆盖物。如标注、矢量图形元素(包括:折线和多边形和圆)、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的处理。 覆盖物包括:本地覆盖物和搜索覆盖物 本地覆盖物的抽象基类:OverlayOptions(核心类) 圆形覆盖物: CircleOptions 文字覆盖物: TextOptions marker覆盖物: MarkerOptions 圆点覆盖物:DotOptions ground 覆盖物:GroundOverlayOptions 圆点覆盖物:DotOptions 多边形覆盖物:PolygonOptions 折线覆盖物:PolylineOptions 弧线覆盖物:ArcOptions
CircleOptions circleOptions = new CircleOptions(); // 2.设置数据 以世界之窗为圆心,1000米为半径绘制 circleOptions.center(new LatLng(22.5422870000, 113.9804440000))//中心 .radius(1000) //半径 .fillColor(0x60FF0000)//填充圆的颜色 .stroke(new Stroke(10, 0x600FF000)); //边框的宽度和颜色 //把绘制的圆添加到百度地图上去 mBaiduMap.addOverlay(circleOptions); }
TextOptions textOptions = new TextOptions(); textOptions.fontColor(Color.RED) //设置字体颜色 .text("自定义文字覆盖物") //设置显示文本 .position(new LatLng(22.5422870000, 113.9804440000)) //设置显示坐标 .fontSize(20) //设置文本大小 .typeface(Typeface.SERIF) //设置字体 Android的字体就三种,对称的,不对称的,等宽的 .rotate(30); //设置旋转角度 //把绘制的圆添加到百度地图上去 mBaiduMap.addOverlay(textOptions); }
Mark覆盖物就有趣多了,她是可以让我们自定义一张图片放上去的,就像那些打车软件一样可以让地图上看到一些车辆的信息 同样的,不管三七二十一,我们继续写一个方法drawMark(); 先看看我这张要塞进去的图片
MarkerOptions markerOptions = new MarkerOptions(); BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.logo); // 描述图片 markerOptions.position(new LatLng(22.5422870000, 113.9804440000)) // 设置位置 .icon(bitmap) // 加载图片 .draggable(true) // 支持拖拽 .title("世界之窗旁边的草房"); // 显示文本 //把绘制的圆添加到百度地图上去 mBaiduMap.addOverlay(markerOptions); }
实现这样的一个效果,其实就是加了一个pop
我们首先得自己定义一个activity_pop.xml
?xml version="1.0" encoding="utf-8"? LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingBottom="0dip" LinearLayout android:id="@+id/user_info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="20dip" android:layout_weight="1" android:background="@drawable/popupmap" android:gravity="center_vertical" android:orientation="horizontal" ImageView android:id="@+id/round" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="2dip" android:src="@drawable/round" / TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="end" android:text="标题" android:textSize="20sp" / ImageView android:id="@+id/roads" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/roads" / /LinearLayout /LinearLayout
预览是这样子的
首先,我们得初始化一些变量
private void initPop() { pop = View.inflate(getApplicationContext(), R.layout.activity_pop, null); //必须使用百度的params LayoutParams params = new MapViewLayoutParams.Builder().layoutMode(MapViewLayoutParams.ELayoutMode.mapMode) //按照经纬度设置 .position(new LatLng(22.5422870000, 113.9804440000)) //这个坐标无所谓的,但是不能传null .width(MapViewLayoutParams.WRAP_CONTENT) //宽度 .height(MapViewLayoutParams.WRAP_CONTENT) //高度 .build(); mMapView.addView(pop,params); //先设置隐藏,点击的时候显示 pop.setVisibility(View.INVISIBLE); //初始化这个title title = (TextView) pop.findViewById(R.id.title); }
mark的点击事件
* 点击某一个mark在他上放显示泡泡 * 加载pop 添加到mapview 把他设置为隐藏 当点击的时候更新pop的位置 设置为显示 mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker result) { //处理点击 ,当点击的时候更新并且显示位置 LayoutParams params = new MapViewLayoutParams.Builder(). layoutMode(MapViewLayoutParams.ELayoutMode.mapMode) //按照经纬度设置位置 .position(result.getPosition()) //这个坐标无所谓的,但是不能传null .width(MapViewLayoutParams.WRAP_CONTENT) //宽度 .height(MapViewLayoutParams.WRAP_CONTENT) //高度 .yOffset(-5) //相距 正值往下 负值往上 .build(); mMapView.updateViewLayout(pop, params); pop.setVisibility(View.VISIBLE); //更新下title title.setText(result.getTitle()); return true; });
这边新加一个功能,就是泡泡轮播切换,咱先看效果图:
其实实现这个不难,就是在设置icon的时候设置一个icons穿进去一个Bitmap的list
MarkerOptions markerOptions = new MarkerOptions(); BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.logo); // 描述图片 ArrayList BitmapDescriptor bitmaps = new ArrayList BitmapDescriptor bitmaps.add(bitmap); //显示多个图片的来回切换,类似于帧动画 bitmaps.add(BitmapDescriptorFactory.fromResource(R.drawable.icon_geo)); markerOptions.position(new LatLng(22.5422870000, 113.9804440000)) // 设置位置 //.icon(bitmap) // 加载图片 //切换图片 .icons(bitmaps) .period(10) //切换时间 .draggable(true) // 支持拖拽 .title("世界之窗旁边的草房"); // 显示文本 mBaiduMap.addOverlay(markerOptions); }
真不好意思,最近一直在加班,空闲的时间越来越少,没事,记录撸代码!!! 接下来讲的是路线标记,相信不少人应该知道,地图导航的时候会帮你标记一条路线,我们今天就来实现这个功能,后续有哪些方法有疏漏,也希望博友能指点出来,毕竟我也是技术渣渣
百度地图移动版API集成搜索服务包括: 位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索 核心类: PoiSearch和OnGetPoiSearchResultListener RoutePlanSearch和OnGetRoutePlanResultListener 初始化PoiSearch类,通过setOnGetPoiSearchResultListener方法注册搜索结果的监听对象OnGetPoiSearchResultListener ,实现异步搜索服务。 通过自定义MySearchListener实现类,处理不同的回调方法,获得搜索结果。 注意, OnGetPoiSearchResultListener只支持一个,以最后一次设置为准 结合覆盖物展示搜索 本地搜索覆盖物:PoiOverlay 驾车路线覆盖物:DrivingRouteOverlay 步行路线覆盖物:WalkingRouteOverlay 换乘路线覆盖物:TransitOverlay
PoiSearch newInstance = PoiSearch.newInstance(); newInstance.setOnGetPoiSearchResultListener(new SearchListener()); // 发出搜索的请求 范围检索 PoiBoundSearchOption boundOption = new PoiBoundSearchOption(); LatLngBounds latLngBounds = new LatLngBounds.Builder() // 确定两点坐标(东北,西南) // 这里我们随机弄两个坐标 分别是深圳世界之窗附近 .include(new LatLng(22.5441560000, 113.9828800000)) // 世界之窗右上角的美加广场 .include(new LatLng(22.5413850000, 113.9777770000)) // 世界之窗左下角的一个不知道叫啥的街道 .build(); boundOption.bound(latLngBounds); // 设置搜索的范围 boundOption.keyword("世界之窗"); // 搜索的关键字 newInstance.searchInBound(boundOption); }
实现它的Listener
public void onGetPoiResult(PoiResult result) { // 收到发送过来的搜索请求之后我们进行处理 if(result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error){ Toast.makeText(getApplicationContext(), "未搜索到结果", Toast.LENGTH_LONG).show(); return; //搜索类型的类 PoiOverlay overlay = PoiOverlay(mBaiduMap); //处理搜索Poi的覆盖物 mBaiduMap.setOnMarkerClickListener(overlay);// 把事件分发给overlay,overlay才能处理点击事件 overlay.setData(result); //设置结果 overlay.addToMap;//把搜索的结果添加到地图中去 overlay.zoomToSpan(); //自动缩放到所以的mark覆盖物都能看到 }
自己实现它的点击事件
PoiResult poiResult = getPoiResult(); PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 得到点击的那个poi信息 String text = poiInfo.name + "," + poiInfo.address; Toast.makeText(getApplicationContext(), text, 0).show(); return super.onPoiClick(index); }
官方的效果,点击后Toast
poiSearch = PoiSearch.newInstance(); poiSearch.setOnGetPoiSearchResultListener(new MyListener()); PoiNearbySearchOption nearbyOption = new PoiNearbySearchOption(); nearbyOption.location(hmPos);// 设置中心点 nearbyOption.radius(1000);// 设置半径 单位是米 nearbyOption.keyword("加油站");// 关键字 poiSearch.searchNearby(nearbyOption); class MyListener implements OnGetPoiSearchResultListener{ @Override public void onGetPoiDetailResult(PoiDetailResult result) { if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){ Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show(); return; String text = result.getAddress()+ "::" + result.getCommentNum() + result.getEnvironmentRating(); Toast.makeText(getApplicationContext(), text, 0).show(); @Override public void onGetPoiResult(PoiResult result) { if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){ Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show(); return; PoiOverlay overlay = new MyPoiOverlay(baiduMap);// 搜索poi的覆盖物 baiduMap.setOnMarkerClickListener(overlay);// 把事件分发给overlay,overlay才能处理点击事件 overlay.setData(result);// 设置结果 overlay.addToMap();// 把搜索的结果添加到地图中 overlay.zoomToSpan();// 缩放地图,使所有Overlay都在合适的视野内 注: 该方法只对Marker类型的overlay有效 class MyPoiOverlay extends PoiOverlay { public MyPoiOverlay(BaiduMap arg0) { super(arg0); @Override public boolean onPoiClick(int index) { PoiResult poiResult = getPoiResult(); PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 得到点击的那个poi信息 String text = poiInfo.name + "," + poiInfo.address; Toast.makeText(getApplicationContext(), text, 0).show(); PoiDetailSearchOption detailOption = new PoiDetailSearchOption(); detailOption.poiUid(poiInfo.uid);// 设置poi的uid poiSearch.searchPoiDetail(detailOption); return super.onPoiClick(index); }
poiSearch = PoiSearch.newInstance(); poiSearch.setOnGetPoiSearchResultListener(new MyListener()); search(); PoiCitySearchOption cityOption = new PoiCitySearchOption(); cityOption.city("北京"); cityOption.keyword("加油站"); cityOption.pageNum(currentPageIndex); poiSearch.searchInCity(cityOption); class MyListener implements OnGetPoiSearchResultListener { @Override public void onGetPoiDetailResult(PoiDetailResult result) { @Override public void onGetPoiResult(PoiResult result) { if (result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) { Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show(); return; String text = "共" + result.getTotalPageNum() + "页,共" + result.getTotalPoiNum() + "条,当前第" + result.getCurrentPageNum() + "页,当前页" + result.getCurrentPageCapacity() + "条"; Toast.makeText(getApplicationContext(), text, 1).show(); baiduMap.clear();// 清空地图所有的 Overlay 覆盖物以及 InfoWindow PoiOverlay overlay = new MyPoiOverlay(baiduMap);// 搜索poi的覆盖物 baiduMap.setOnMarkerClickListener(overlay);// 把事件分发给overlay,overlay才能处理点击事件 overlay.setData(result);// 设置结果 overlay.addToMap();// 把搜索的结果添加到地图中 overlay.zoomToSpan();// 缩放地图,使所有Overlay都在合适的视野内 注: // 该方法只对Marker类型的overlay有效 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_1){ currentPageIndex++; search(); return super.onKeyDown(keyCode, event); class MyPoiOverlay extends PoiOverlay { public MyPoiOverlay(BaiduMap arg0) { super(arg0); @Override public boolean onPoiClick(int index) { PoiResult poiResult = getPoiResult(); PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 得到点击的那个poi信息 String text = poiInfo.name + "," + poiInfo.address; Toast.makeText(getApplicationContext(), text, 0).show(); return super.onPoiClick(index); }
RoutePlanSearch newInstance = RoutePlanSearch.newInstance(); newInstance.setOnGetRoutePlanResultListener(new MyListener()); //驾车路线 DrivingRoutePlanOption drivingOption = new DrivingRoutePlanOption(); PlanNode from = PlanNode.withLocation(new LatLng(22.5422870000, 113.9804440000)); //设置起点世界之窗 PlanNode to = PlanNode.withLocation(new LatLng(22.5455910000,113.9880900000)); //设置终点就附近的欢乐谷 drivingOption.from(from); drivingOption.to(to); drivingOption.policy(DrivingRoutePlanOption.DrivingPolicy.ECAR_DIS_FIRST); //方案:最短距离 这个自己设置 比如时间短之类的 newInstance.drivingSearch(drivingOption); class MyListener implements OnGetRoutePlanResultListener{ @Override public void onGetDrivingRouteResult(DrivingRouteResult result) { //驾车 if(result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error){ Toast.makeText(getApplicationContext(), "未搜索到结果", Toast.LENGTH_LONG).show(); return; //开始处理结果了 DrivingRouteOverlay overlay = new MyDrivingOverlay(baiduMap); baiduMap.setOnMarkerClickListener(overlay);// 把事件传递给overlay overlay.setData(result.getRouteLines().get(0));// 设置线路为第一条 overlay.addToMap(); overlay.zoomToSpan(); @Override public void onGetTransitRouteResult(TransitRouteResult result) { // 公交换乘 @Override public void onGetWalkingRouteResult(WalkingRouteResult result) { // 步行 class MyDrivingOverlay extends DrivingRouteOverlay{ public MyDrivingOverlay(BaiduMap arg0) { super(arg0); @Override public BitmapDescriptor getStartMarker() { //覆写此方法以改变默认起点图标 return BitmapDescriptorFactory.fromResource(R.drawable.icon_st); @Override public BitmapDescriptor getTerminalMarker() { //覆写此方法以改变默认终点图标 return BitmapDescriptorFactory.fromResource(R.drawable.icon_en); }
官方的效果图
LocationClient和BDLocationListener 首先需要打开定位图层BaiduMap.setMyLocationEnabled(true); 设置监听器LocationClient. registerLocationListener(BDLocationListener) 设置定位模式baiduMap. setLocationMode(LocationMode) Hight_Accuracy,高精度定位模式:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果; Battery_Saving,低功耗定位模式:这种定位模式下,不会使用GPS,只会使用网络定位(Wi-Fi和基站定位) Device_Sensors,仅用设备定位模式:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位 设置定位显示模式BaiduMap.setMyLocationConfigeration(MyLocationConfiguration) 定位数据获取:在BDLocationListener. onReceiveLocation(BDLocation result)方法中设置定位数据, baiduMap.setMyLocationData(MyLocationData);
一个GPS定位,不过必须要三颗星以上才可定位,不然是定不了的,还有一个基站地位,他其实每个基站都有一个ID,就是一个位置,查到最近基站的位置然后去服务器里请求返回位置信息,还有一个wifi定位,当你的手机连接wifi,你开始定位的时候,把wifi的地址发送到百度的服务器,服务器会把大部分wifi地址都有收录,直接返回经纬度
地址:http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0
我们根据百度提供的文档去做
private void lacate() { mLocationClient = new LocationClient(getApplicationContext()); myListener = new MyListener(); mLocationClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式 option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02 option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms option.setIsNeedAddress(true);// 返回的定位结果包含地址信息 option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向 mLocationClient.setLocOption(option); geo = BitmapDescriptorFactory .fromResource(R.drawable.icon_geo); MyLocationConfiguration configuration = new MyLocationConfiguration( MyLocationConfiguration.LocationMode.FOLLOWING, true, geo); baiduMap.setMyLocationConfigeration(configuration);// 设置定位显示的模式 baiduMap.setMyLocationEnabled(true);// 打开定位图层 }
继续自己写个Listener
baiduMap.setMyLocationConfigeration(new MyLocationConfiguration( MyLocationConfiguration.LocationMode.NORMAL, true, geo));// 设置定位显示的模式 break; case KeyEvent.KEYCODE_2: // 罗盘 baiduMap.setMyLocationConfigeration(new MyLocationConfiguration( MyLocationConfiguration.LocationMode.COMPASS, true, geo));// 设置定位显示的模式 break; case KeyEvent.KEYCODE_3: // 跟随 baiduMap.setMyLocationConfigeration(new MyLocationConfiguration( MyLocationConfiguration.LocationMode.FOLLOWING, true, geo));// 设置定位显示的模式 break; default: break; return super.onKeyDown(keyCode, event); }
百度地图算是写完一半了,为什么说只写完了一半,因为时间紧迫,里面肯定会有些错误的编写,不过思想是对的,你按照步骤来,结合你对百度API的认知,这些其实都是很简单就去实现的,这里只是作为一个抛砖引玉
技术分享 | app自动化测试(Android)--高级定位技巧 通常使用定位器定位页面上的元素会发生一些定位不到元素,或者定位失败的情况。有可能是页面上元素不唯一,有可能是页面发生变化。这节介绍定位元素的高级用法,使用层级关系定位或者多重属性定位的方式来确定元素的唯一性,从而更精准,更稳定的定位到想要的元素。
相关文章
- Android 12 还没用上,Android 13 已经来了!
- 安卓项目实战之:Android常用的5种加密方式
- 测试android sdk是否安装成功,配置Android SDK
- 【Android布局】在程序中设置android gravity 和 android layout Gravity属性
- android telephony 原理解析与开发指南_Android逆向pdf
- android scaleanimation动画,Android 的ScaleAnimation 缩放动画基本运用
- Android保存图片到相册(适配android 10以下及以上)
- android跳转到相册需要权限,Android打开相册获取图片路径[通俗易懂]
- Android Development Studio 初学者教程
- android studio快捷键设置。
- 【Android RTMP】音频数据采集编码 ( FAAC 编码器编码 AAC 音频采样数据 | 封装 RTMP 音频数据头 | 设置 AAC 音频数据类型 | 封装 RTMP 数据包 )
- 【错误记录】未安装该应用 ( 在 Android 12 之后 组件设置 android:exported=“false“ 属性 )
- 【ijkplayer】编译 Android 版本的 ijkplayer ③ ( 执行 compile-ffmpeg.sh clean 命令 | 下载并配置 android-ndk-r10e )
- Android开发中遇到的问题(三)——eclipse创建android项目无法正常预览布局文件详解手机开发
- Android 指南针传感器详解编程语言
- android向导布局优化
- 在android中增加curl的解决方法
- Android中的全局变量与局部变量使用小结
- C#采用Winform实现类似Android的Listener
- Android录音应用实例教程