Android 关于百度地图Android SDK几处修正使用说明(非官方)

本篇主要是因为最近在学习使用百度地图,发现了一些问题,跟大伙分享一下。

1、根据android sdk开发指南中“Hello World”的例子,构建一个基础的地图页面,如果大家完全按照示例代码中所写的那样,是不会执行成功的,会有以下问题的错误提示“java.lang.RuntimeException: Unable to instantiate activity ComponentInfo

这个问题出现的原因是

在第二步,配置Activity部分,android:name的值为.MapDemo,而在第四步,创建地图Activity处,创建的Activity继承类名写的却是MyMapActivity。如果你想让在AndroidManifest.xml中配置Activity时的.MapDemo为起始的Activity,除了要在<Activity></Activity>之间加上以下这段代码之外

1
2
3
4
<intent-filter>
    <actionandroid:name="android.intent.action.MAIN"/>  
    <categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>

还要把android:name的.MapDemo改成你当前项目的“包名+MyMapActivity”或者直接写“MyMapActivity”,这样再执行就会构建出一个基础的百度地图。

这个问题其实也是一个Android开发的基础问题,也算是对我这个Android半吊子一个知识点的巩固。下面针对这个问题的出现回顾以下知识点:

(1)AndroidManifest.xml作为项目的布局文件,时时刻刻把握整个项目命脉,项目启动时,要设置启动项,权限不够时,要加相应的权限设置。

(2)在AndroidManifest.xml中配置的Activity如何与src中的.java文件联系在一起呢?就是依靠配置的该Activity中的android:name的值要完全与.java文件中的类名一致。

(3)而“后台”的.java文件又是如何与“前台”的res/layout中的activity布局文件联系在一起的呢(请允许我用前后台这样的非专业术语来说,因为自己主做web开发,这样说感觉比较形象)?就是通过.java文件中,继承Activity类的新类的OnCreate方法中

1
setContentView(R.layout.activity_main)

这样的一条语句搞定的,这里的activity_main即是布局文件的名字而已。

由以上的几条我们会发现Android开发中,主要的两个东西都是靠名称去匹配的,所以我们在开发中一定要在这方面多多注意,至于是不是其他的东西也是依赖名称去匹配,就需要我们去不断在开发中发现。

2、说的第二个问题是关于坐标的,在百度地图给出的源码中,我们会发现类似这样的语句

1
GeoPoint point =new GeoPoint((int)(39.915* 1E6),(int)(116.404* 1E6));

翻译一下就是创建一个GeoPoint类型的纬度为39.915度,经度为116.404度的坐标点,为什么要*1E6,是为了把传入的经度,纬度转换成微度,就是在原基础上乘以10的-6次幂。至于GeoPoint中到底是什么样,那都是百度封装好的,所以我也懒着去关心了,大家知道跟坐标点有关就行了。

不过这里容易出现一个小问题,就是我们习惯性的会认为写坐标点的时候是这种格式“经度,纬度”,而这个方法的构造函数完全是相反的。当然,这不算什么,但是问题就出在,在百度地图官方给出的“拾取坐标系统”工具(链接:http://api.map.baidu.com/lbsapi/getpoint/index.html,这个东东还是很实用的,如果我们做地图开发没有它,那就没戏啦,它主要就是坐标-地址的查询工具)中,使用的坐标点形式就是“经度,纬度”,有点把我们带偏的感觉。所以容易搞错,这块要注意一下,否则坐标都在十万八千里之外了。

PS:经度(longitude),纬度(latitude)

3、关于定位SDK的,这个问题真心的很坑人。下午耗了几个小时,真不爽。

虽然标题说的是android sdk,

在百度地图官方定位SDK处可谓是非常详细,把如何构建基础定位功能的步骤已经详细给我们列出,但这里有个小瑕疵我不得不说,达到了令人发指的地步。

先来简单回顾一下百度地图官方给出的东东

在V4.1版本的第3点,功能类的使用,3.1.1初始化LocationClient类 小节

1
2
3
4
5
6
7
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
                
publicvoid onCreate() {
    mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类
    mLocationClient.registerLocationListener( myListener );    //注册监听函数
}

3.1.3设置定位参数 小节

1
2
3
4
5
6
7
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式
option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
option.setScanType(5000);//设置发起定位请求的间隔时间为5000ms
option.setIsNeedAddress(true);//返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);//返回的定位结果包含手机机头的方向
mLocClient.setLocOption(option);

对了这处的第4行setScanType方法请改写成setScanSpan。之所以写错可能是先前版本的成员方法名,在这个版本中已经不再存在。

3.1.4发起定位请求 小节

1
2
3
4
if (mLocClient != null && mLocClient.isStarted())
  mLocClient.requestLocation();
else
 Log.d("LocSDK3""locClient is null or not started");

乍一看条理非常的清晰,先声明类,绑定方法,如果有特殊要求,再加个option的设置,最后验证对象是否为空,不为空就执行最终的请求定位,多完美啊!~

但是如果我们就这样执行了,那么就会发现log中一直出现“locClient is null or not started”这句话,我试了N多遍,都有了想吐血的冲动(请原谅我的吐槽),最后通过对定位sdk的sample一行一行去找才发现了问题(之所以一行一行的找,是因为把项目导入本地工程之后,各种红,运行不了),原因就在于,在对LocationClient类实例调用requestLocation()方法之前,一定要调用一下start()方法,像这样:

1
mLocationClient.start();

哦~~那是什么?对的,开发指南中并没有写出来。应该是一个使LocationClient实例启动的方法,所以后面if条件句中的isStarted()我们也就明白是怎么回事了。

4、接着说一下如何成功在本地运行Android SDK给出的“BaiduMap_AndroidSDK_v2.4.1_Sample”示例,这是官方的一个Demo,为我们展示了在Android SDK下的各个功能模块。

如果大家细心读了百度地图的使用规则,就知道如果我们想使用百度地图API,就必须申请对应的KEY,而申请KEY的关键,我总结的话就是在安全码上,下面只说Android SDK安全码组成:数字签名+;+包名

其实这部分百度地图申请KEY的《查看详细配置方法》里已经详细说明。我只是想说这里的包名,要写成我们下载下来的示例包名:baidumapsdk.demo。

这块可能对大多数朋友来说顺理成章,我之所以说一下是因为第一次申请KEY,而且是先创建了一个本地项目,又没有直接去运行Sample,所以当时就有点懵,误把针对自己项目的KEY当成可以在Sample上使用的KEY。

这块大家没遇到这个问题就从脑子里抹去吧。


随着一步步的探索,慢慢的就能跟随自己的想法来使用百度地图去设计一些小功能了,之后也遇到了一些问题,不过感觉解决的都很快,这里就不一一详述了,都是些小问题。如果大家遇到其他Android SDK上的问题比较头大,我们可以交流一下。

另外,这几天通过对百度地图API的学习,也看到了差距,自己还是要不断的去学习,提升自己,向度娘看齐。










本文转自 我不会抽烟 51CTO博客,原文链接:http://blog.51cto.com/zhouhongyu1989/1409723,如需转载请自行联系原作者

上一篇:关于Windows任务管理器 5个不错的替代选择


下一篇:c#开发wps插件