基于百度地图V3.1百度定位V4.2的开发起步



注:一些源码出自百度官网Demo


1)说点废话:

从拿到地图+定位这个需求的时候,我还算淡定,因为基于Google地图的资料太多了,不管是文字的还是视频,随便一百度就一大堆,但是那些都是基于Google map V1的。现在已经不提供V1版本的apiKey了,因此,直接跳过V1使用V2。至于V2Key怎么注册申请都不说,因为Google map是需要Google Play服务的,我尝试了很多次,那个软件怎么都登陆不上,据说是咱国家把Google给墙了,而且获取一些开发资料的时候也需要翻墙,废了老劲了,最后就是程序没法跑,没办法只能用百度的地图+定位,可能是我才疏学浅,有能弄好的大神,还望来喷啊^_^

 

2)准备工作:

首先在官网上下载对应的jar包和so引擎,

这里需要注意两点:

1.如果是开发单独的应用,比如只需要地图或是只需要定位,两者不结合,直接下载对应的包就行了。

百度地图 baidumapapi_v3_1_0.jar

百度定位 BaiduLBS_Android.jar

 

2.如果是两个功能结合使用,需要在百度地图上进行定位,就需要这两个包

百度地图 baidumapapi_v3_1_0.jar

百度定位 locSDK_4.2.jar

其目录结构如下:

 

这里并不是将第一点里的两个包整到工程里,那样的话回报一个两个证书的错误:

Error generating final archive: Found duplicate file for APK: assets/sapi_cert.cer
Origin1:D:\BaiduMapTest_2\libs\BaiduLBS_Android.jar
Origin2: D:\BaiduMapTest_2\libs\baidumapapi_v3_1_0.jar

 

这一点是比较坑爹的,居然没人说,而且在Demo里面是用的老版本的定位……这些包官网上还都是有的,懒得找的话直接把包名直接百度就行了。

 

3)走起!

没有接触过得同学们,我还是建议大家一个一个的来,首先把HelloMap的工程弄好,我觉得那个官方的文档最开始的那篇写的还是不错的。

接下来就是把定位的那个程序弄好,就是接收到位置,输出一堆的那个。代码如下图:

 

 

Hello Map:

 

代码部分就这么一段就行,关键是Manifest文件,官方文档上写的一样都不能丢,尤其是权限,这里就不再细说代码怎么写了,注意两点细节:

1.申请Key的时候,包名是和Manifest文件最上面有个PackageName属性,要和那里面的值一只,否则调试程序的时候会有permission denied错误,不能显示地图,只能显示灰色小格。

2.权限问题,百度官方说的需要那么多权限,就复制过去好了,回来再一个个研究。

 

BaiduLocation

 

 

这个程序的代码我没有粘全,官网上都有的,不细说,还是细节问题:

1.定位需要在manifest文件里声明定位服务,否则会出现onReceiveLocation方法不回调的现象

2.权限问题,还是像上面的把需要的权限复制过去就行了,Demo里都有的

3.在调试的时候虚拟机默认是没有SDCard的,这时这个程序的errorCode会返回167

就是没有SD卡所致,建议真机调试下,正常的是161(网络定位),没记错的话还有个GPS定位的代码,好像是两位,官网上有不记得了……

 

 

 

 

 

 

 

 

 

 

 

 

 

定位+地图

这里注意定位和地图所需要的权限是不一样的,有交叉的部分,这里需要注意:

 

剩下的就是添加overLay了,代码如下,写的很不好,测试用的有一些没用,时间紧没整理,见谅啊……

 

private LocationClient mLocationClient = null;

private MapView mMapView = null;

private BaiduMap mBaiduMap = null;

private BitmapDescriptor bitmap = null;

private LatLng point = null;

private OverlayOptions option = null;

private TextView content = null;

private boolean isFirstLoc = true;

 

private double lontitude = 116.404;// 初始值指向天安门

private double latitude = 39.915;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

SDKInitializer.initialize(getApplicationContext());

setContentView(R.layout.activity_main);

content = (TextView) findViewById(R.id.content);

content.setText("lontitude" + lontitude + "latitude" + latitude);

mMapView = (MapView) findViewById(R.id.bmapView);

mMapView.refreshDrawableState();

mBaiduMap = mMapView.getMap();

 

LocationClientOption clientOption = new LocationClientOption();

clientOption.setLocationMode(LocationMode.Hight_Accuracy);

clientOption.setOpenGps(true); // 打开gps

clientOption.setCoorType("bd09ll"); // 设置坐标类型为bd09ll

clientOption.setScanSpan(3000); // 定时定位,每隔5秒钟定位一次。

 

mLocationClient = new LocationClient(getApplicationContext()); // 声明LocationClient类

mLocationClient.setLocOption(clientOption);

mLocationClient.registerLocationListener(new BDLocationListener() {

 

@Override

public void onReceiveLocation(BDLocation location) {

StringBuffer sb = new StringBuffer(256);

sb.append("\ntime : ");

sb.append(location.getTime());

sb.append("\nerror code : ");

sb.append(location.getLocType());

sb.append("\nlatitude : ");

sb.append(location.getLatitude());

sb.append("\nlontitude : ");

sb.append(location.getLongitude());

sb.append("\nradius : ");

sb.append(location.getRadius());

if (location.getLocType() == BDLocation.TypeGpsLocation){

sb.append("\nspeed : ");

b.append(location.getSpeed());

sb.append("\nsatellite : ");

sb.append(location.getSatelliteNumber());

sb.append("\ndirection : ");

sb.append("\naddr : ");

sb.append(location.getAddrStr());

sb.append(location.getDirection());

else if (location.getLocType() == BDLocation.TypeNetWorkLocation {

sb.append("\naddr : ");

sb.append(location.getAddrStr());

// 运营商信息

sb.append("\noperationers : ");

sb.append(location.getOperators());

}

content.setText(sb.toString());

// map view 销毁后不在处理新接收的位置

if (location == null || mMapView == null)

return;

MyLocationData locData = new MyLocationData.Builder()

.latitude(location.getLatitude())

.longitude(location.getLongitude()).build();

mBaiduMap.setMyLocationData(locData);

if (isFirstLoc) {

isFirstLoc = false;

LatLng ll = new LatLng(location.getLatitude(),

location.getLongitude());

MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);

mBaiduMap.animateMapStatus(u);

mBaiduMap.clear();

mBaiduMap.addOverlay(new  MarkerOptions().position(ll).icon(bitmap));

}

}

});

 

// 定义Maker坐标点

point = new LatLng(latitudelontitude);

// 构建Marker图标

bitmap=BitmapDescriptorFactory.fromResource(R.drawable.jiantou);

// 构建MarkerOption,用于在地图上添加Marker

option = new MarkerOptions().position(point).icon(bitmap);

// 在地图上添加Marker,并显示

mBaiduMap.addOverlay(option);

mLocationClient.start();

 

if (mLocationClient != null && mLocationClient.isStarted())

mLocationClient.requestLocation();

else

Log.d("LocSDK3""locClient is null or not started");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值