本篇主要是因为最近在学习使用百度地图,发现了一些问题,跟大伙分享一下。
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>之间加上以下这段代码之外
<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方法中
setContentView(R.layout.activity_main)
这样的一条语句搞定的,这里的activity_main即是布局文件的名字而已。
由以上的几条我们会发现Android开发中,主要的两个东西都是靠名称去匹配的,所以我们在开发中一定要在这方面多多注意,至于是不是其他的东西也是依赖名称去匹配,就需要我们去不断在开发中发现。
2、说的第二个问题是关于坐标的,在百度地图给出的源码中,我们会发现类似这样的语句
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类 小节
public LocationClient mLocationClient = null; public BDLocationListener myListener = new MyLocationListener(); publicvoid onCreate() { mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类 mLocationClient.registerLocationListener( myListener ); //注册监听函数 }
3.1.3设置定位参数 小节
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发起定位请求 小节
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()方法,像这样:
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的学习,也看到了差距,自己还是要不断的去学习,提升自己,向度娘看齐。
本文出自 “给我一根儿烟” 博客,请务必保留此出处http://zhouhongyu1989.blog.51cto.com/2931598/1409723