基于MapView实现的MapNavigator

从2009年2月份开始就一直在做这个,希望能够利用Google提供的API完成一个基于MapView的应用: MapNavi.apk。中途遇到了不少困难,主要都是由于对于Android和JAVA不熟悉造成的,另外基于Android的Google API由于出现的时间不长,因此各种类该如何使用都很少有现成的例子,因此程序虽然不长,却也耗费了我一个月的时间,才让这个东东有了一个雏形,心里还是小有成就感的。时至今日,想对自己到今天为止做的工作做一个的总结,主要目的是让自己这些日子的忙碌(其实也没忙到焦头烂额- -b主要是查google API实在是一件非常恼人的工作)有个归属,对Android不感兴趣的看官可以到此为止了(呃,其实没期待有谁来看我的博文的…毕竟闲来无事的涂鸦之作也并不高明,自嘲一下

 

== 提纲 About MapNavi. ==

1. 开发环境及开发过程

    从调研到写代码的总体流程。

2. 实现的功能 done

    编程过程中用到了不少东西,当然大部分都是属于Google Android API,编写代码的过程事实上是学习这些package怎么用的过程

3. 中途遇到的问题,以及解决方法 problem & solution

    对于一个对Java语言几乎一无所知的人来说,编写普通的Java程序就已经是一件烦人的事情了。何况还要在学习Java的同时又学习Android应用开发……Google为Android提供了比较完善的开发包,所有的东西几乎独立于Java程序开发,因此必须要额外学习Android开发。Google为初学者提供了起步的初级教程,个人感觉对于初步把握Android的开发还是有一定帮助的。另外,很多网站已经将Android documentation翻译成中文,对看英文头疼的朋友可以直接查阅中文网站。

    原开发网站:http://code.google.com/intl/zh-CN/android/documentation.html

    中文网页:http://www.androidin.com/pub/Android_Docs/Android_Docs_Trans/documentation.html

4. 尚待完善的部分 to do

    时间紧迫,因此我努力在短时间内搭出一个可以展示的框架,但是其中有很多细节都没有详细考虑,因此本身只是作为一个model,可以作为今后开发的参考,并没有成为完善的应用程序的打算

5. 参考 reference

    开发过程在网上参考了无数资料,遇到各种问题也都Google之,虽然很多问题都没有确切的解决方案(或者说我遇到的问题太白痴所以没有人觉得是问题?囧一个先),但都为我对问题的解决提供了有价值的参考。

 

=====================================华丽的分割线=====================================

下面进入正文。

 

======== 开发环境 ========

Eclipse SDK

Version: 3.4.1
Build id: M20080911-1700

(c) Copyright Eclipse contributors and others 2000, 2008.  All rights reserved.
Visit http://www.eclipse.org/platform

This product includes software developed by the
Apache Software Foundation http://www.apache.org/

 

ANDROID SOFTWARE DEVELOPMENT KIT

 

Google官方网站上提供了在Eclipse上搭建G1模拟器环境的完整的说明。由于当前版本的Android并不支持中文输入法,并且G1还没有在中国大陆公开上市发布,因此采用模拟器来进行开发肯定是大部分人的最佳选择。(题外话,话说G1的手感的确很不错……YYing...)

(G1是什么?参考:http://baike.baidu.com/view/1990939.htm

模拟器:

 

======== 我的开发过程 ========

    2008年10月

    确定自己要做这个东东,且主要基于Google Map进行开发。但是对于具体做成什么样子,以及要用到哪些API,都完全没有概念。

 

    2009年2月5日

    正式开始工作,此前的3个月直接晃悠过去(- -b)首先做的工作是安装Eclipse、Android SDK、以及阅读Android Development Documentation。在了解了Andriod的基本开发流程和阅读了Documentation中提供的NotePad教程后,开发正式开始。

    关键问题:AndroidManifest.xml、Activity、Layout

 

    2009年2月10日~2月14日

    晃晃悠悠地开始了对本人开发目标中的核心问题:MapView的研究。成功地让Google Map在自己的小破程序中显示出来,不过只具有放大和缩小功能。

    (MapView是什么?下面的解释或许并不准确,但足够通俗,个人认为对于初学者应该可以理解,知道Google Map吧?G1手机上可以显示Google Map,而Google Map就是通过MapView来显示的。也就是说,如果你想要为G1编写一个程序来显示Google Map,需要用到的一个Class就是MapView,但是MapView不能单独使用,它必须放在另一个类:MapActivity中,这个类就相当于你的应用程序主程序,且只有它(或者它的子类)才能够管理MapView并且完成Map的显示)

    关键问题:MapView doesn't show map

 

    2009年2月11日~2月16日

    在程序中添加了一个数据库,将地图以合适的比例定位到PKU上方,实现了在地图上“加点”的简单功能。(加点:就是鼠标在模拟器上点一下,就画一个圆圈)

    再汗颜一下,为了能够加点,我也用了2天时间来查询Overlay的用法(class Overlay:负责在MapView上画各种东东的一个基类,此类是个抽象类,需要extends)

    关键问题:SQLiteDB、Overlay、根据像素点计算经纬坐标、"Source not found"

 

    2009年2月18日~2009年3月8日(今天)

    开发过程持续而缓慢地进行,在之前的基础上实现了更多的功能。具体不再赘述。

 

======== 实现的功能 ========

1. 普通的“加点”

2. 用户自己选择图片,加入到地图中去,并自己输入相关的信息,比如说,在某个建筑物上插入一个图片,并辅以自己的特色介绍。所有的信息将被保留在数据库中,在程序下次运行的时候被载入

3. 从手机的联系人列表中导入相关联系人,如果你的朋友在这里工作,则可以使用该功能

4. 当用户开启自己的位置感知功能后,如果走近了系统预设的一些标志性建筑附近,则程序会给出提示,并询问用户是否到网上去搜索相关介绍,图为在北京大学网站中取得的北大图书馆介绍。

5. 所有的数据都存储在数据库SQLite中,包括用户加入的Overlay信息和配置信息,并且在程序启动时被读入。

 

======== 问题与解决 ========

    我想其他的Android App开发者一定和我一样,在开发过程中会遇到各种问题,我在这里把我自己的遇到的问题给分享一下,如果看官路过能觉得对你有所帮助,那我会很高兴。

1. MapView中显示地图

    网上能搜索到很多关于“MapView不显示地图”的问题,然而遗憾的是,我没有发现一个解决方案是适合我的,所以在这个问题上我花费了不少时间,或许是我看文档不仔细,所以这种白痴问题只有我才犯了?呵呵,无所谓了,下面总结一下解决方案。

1) 与MapView的标签相关

    网上搜到的一种解答是关于MapView的标签,有人说需要写成"<class ..."的形式,但我觉得这个并没有任何帮助,Google提供的APIDemo中,关于这个问题说的很清楚,标签只要按照如下写就可以了,其中黑体部分对应的即为MapView的标签,不需要任何改动;红色部分是自己的api_key_4_debug,这个可以在Google的官方网站上获得,每台安装android-sdk的机器都不一样,具体的获取办法请参见google documentation中的Q&A--TroubleShooting,这个问题在其中有提到,如果不填入api_key的话,是无法成功显示地图的:

//mapview.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_mapTab"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
>
   
    <com.google.android.maps.MapView
        android:id="@+id/mv"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:enabled="true"
        android:clickable="true"
        android:apiKey="enter_your_api_key"
    />

   
</RelativeLayout>

 

2) 问题在AndroidManifest.xml中

    什么是AndroidManifest.xml?通俗说,里面罗列了开发的程序中的所有Activity、Service、and so on,并对程序的权限给出限制(如可否连接网络、能否使用Google Map等)

    我的问题就在这里面,下面几句话一定要加上,否则地图是无法显示的:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-permission android:name="android.permission.INTERNET" />

<uses-library android:name="com.google.android.maps" />

    其中前两个标签是允许Google Map显示,后一个标签是引入Google Map的library。我之前的错误是,少写了前两个uses-permission,但是网上其他人关于此问题的答案却都是加上uses-library,我搜索范围内没人提到uses-permission的,是不是我太弱了…我很无语…

 

2. "Source not found"

    呃,这是一个通用问题,在使用Eclipse DEBUG功能时,每次遇到runtime error,程序总会出现"Source not found",除此之外,一无所知……

    一般情况,出现这句话的原因是程序抛出了Exception,按照如下方式测试可以找到问题的症结所在,DEBUG模式下,在跳出"SNF"的代码部分加上如下try语句:

try {

    //your problem code

}

catch (Exception e)

{

    Log.e("Err", "Err: " + e.toString());   //insert a breakpoint here

}

这样就可以通过logcat看到错误了,或者直接断点查看e.toString(),就知道到底是什么问题了

 

3. SQLite创建table时跳出异常

    这个问题可能和Android不太相关,就是注意,在SQLite db中,整型的表示是integer,不是int,如下的创建表语句应该把int换成integer才正确

    create table testTable ( col_1 int );

 

4. popupWindow doesn't popup

    其实显示一个popupWindow只需要两三行代码,但是我就是没法让他成功显示……那两天弄这个问题弄到抓狂,网上大部分实例都是旧版android sdk中的解决办法,然而新版的sdk把旧版的关于popupwindow的方法换掉了,害我试了好久……SDK 1.0中,显示popupWindow的代码如下:

PopupWindow popup = new PopupWindow(
      this.getLayoutInflater().inflate(R.layout.layout_popupWindow, null), 
      layout_width, 
      layout_height

);

popup.showAtLocation(View parent_view, int gravity, int x, int y);

    参数名已经能够说明其意义,我就不多做解释了。关键问题在于如何为popupWindow设置一个non-null layout,而getLayoutInflater().inflate()方法就是这个作用,直接写findViewById()得到的结果必然是null。

 

======== 尚待完善的部分 ========

    很多……比如说,popupWindow的样式太丑,想要弄漂亮一点- -b;比如说,好多Dialog都显示得很丑,想要好好调一下Layout(顺便YY一下C#,用它就可以很方便做出来好看的界面——至少不丑,开发人员花费太多时间在界面上的确是相当不划算的事情);比如说,想要向地图中加入导航功能;比如说……想到的太多,就不一一列举了。

 

======== Ref ========

    在此感谢伟大的Google和Baidu,感谢那些在我之前从事Android开发的前辈们,我正在踏着你们的足迹一点点地摸索前行,虽然最后可能什么都得不到,不过毕竟探索的过程充满乐趣,我会继续走下去。PS.参考网站记不得太多了,下面仅仅是一小部分,是在遇到了问题的时候我求解的印记……:

 

======= 最后 =======

    本人不反对转载,毕竟开源的东西要拿出来和大家分享,但是上面的内容是我自己的血汗,所以,如果转载请注明出处:http://blog.sina.com.cn/yyareustilllovingme,谢谢~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值