前面完整的Android引路蜂地图应用源码下载 提供了源码下载,这里对这个项目做个简单的说明以方便阅读。
整个应用代码量在4000行左右,不算很大,下面是对代码中主要Package的说明:
文件名 | 空行 | 注释 | 代码行 | 说明 |
AboutActivity.java | 13 | 4 | 47 | 关于软件说明 |
app\GNavigatorApplication.java | 27 | 23 | 93 | 主应用类 |
app\SessionInfo.java | 9 | 3 | 11 | 保持一些全局变量 |
app\SharedMapInstance.java | 13 | 38 | 18 | 保存RasterMap类实例 |
app\SharedSearchResults.java | 12 | 0 | 22 | 保存查询结果 |
database\DatabaseAssistant.java | 42 | 63 | 122 | 用于数据库访问,用来管理设备,这部分可以不看 |
database\DBAdapter.java | 27 | 126 | 77 | |
database\DBMapper.java | 4 | 38 | 7 | |
database\DeviceDBMapper.java | 20 | 86 | 130 | |
database\DeviceLocationHistoryDBMapper.java | 19 | 56 | 60 | |
database\PersistentFacade.java | 28 | 168 | 67 | |
dataobject\Device.java | 14 | 0 | 15 | 设备定义,设备命令,这部分可以不看 |
dataobject\DeviceCommand.java | 7 | 0 | 17 | |
dataobject\DeviceLocationHistory.java | 5 | 0 | 7 | |
device\AddDeviceActivity.java | 14 | 1 | 70 | 软件可以用来跟踪其他设备或者报告设备当前位置,这部分可以不看 |
device\DeviceCommandListActivity.java | 39 | 4 | 202 | |
device\DeviceControlTabActivity.java | 16 | 1 | 80 | |
device\DeviceInfoActivity.java | 8 | 1 | 49 | |
device\DeviceLocationHistoryListActivity.java | 19 | 1 | 81 | |
device\ManageDeviceListActivity.java | 44 | 4 | 208 | |
drawing\AndroidFont.java | 9 | 27 | 17 | 和Android平台相关的引路蜂图形接口实现 |
drawing\AndroidGraphics.java | 20 | 150 | 57 | |
drawing\AndroidGraphicsFactory.java | 10 | 83 | 23 | |
drawing\AndroidImage.java | 20 | 114 | 65 | |
gis\FileMapTiledZone.java | 17 | 23 | 43 | 用来访问离线地图文件 |
GNavigatorActivity.java | 82 | 31 | 516 | 主Activity |
GuidebeeMapView.java | 52 | 25 | 301 | 地图View,可以自定义并扩展,支持Gesture缩放等 |
location\LocationService.java | 54 | 55 | 90 | GPS服务 |
mapmode\MapModeListActivity.java | 16 | 11 | 50 | 选项地图模式界面 |
routing\RouteDetailActivity.java | 52 | 34 | 274 | 显示详细路径 |
routing\RoutingActivity.java | 26 | 1 | 159 | 路径查询界面 |
search\SearchResultListActivity.java | 41 | 25 | 246 | 查询结果 |
search\SearchSuggestionProvider.java | 2 | 0 | 9 | 查询提示 |
settings\SettingsActivity.java | 19 | 26 | 86 | 软件设置界面 |
sms\DeviceMessage.java | 4 | 0 | 5 | 控制设备的短消息处理,这部分可以不看 |
sms\DeviceMessageCenter.java | 7 | 0 | 18 | |
sms\DeviceMessageProcessor.java | 45 | 1 | 209 | |
sms\SmsMessageReceiver.java | 13 | 15 | 28 | |
ToolbarButton.java | 36 | 1 | 259 | 工具条自定义View |
其中和Device相关的部分,包database, dataobject, device, sms 部分可以跳过不需要看,这部分和地图API使用关系不大,主要用来监视GPS设备或其它手机的位置。
drawing 包实现了地图API中和图形系统相关接口的Android平台上实现 ,引路蜂地图开发包中Gis.Drawing 类定义了几个抽象类或接口,对不同平台的图形系统进行了抽象。这些绘图的接口不同,如果在引路蜂地图开发包直接引用这些类方法,这样不同平台就会需要编译不同的开发包。通过抽象处理,引路蜂地图开发包并直接调用平台相关的图形类方法。而是通过 开发包 + 平台相关图形系统实现的方法,就可以实现跨平台.具体可以参见图形子系统。
GuidebeeMapView 主要用来显示地图,这个给出的是一个参考实现,支持触摸屏平移,事件你可以把地图放在任何可以显示Image对象的控件上,添加你自己的Logo,支持MultiTouch 缩放等,本身是个自定义View (为View的子类),你可以自由扩展其功能。
FileMapTiledZone 用来支持从文件读取离线地图,这部分代码可以不需修改应用到你自己编写的引路蜂地图应用中。
应用程序框架基于RoboGuice 以简化代码,关于RoboGuice的使用可以参见本博客 的Android RoboGuice 使用指南。
搜索使用Android平台的Search Framework。可以参见
App/Search/Invoke Search |
App/Search/Query Search Results |
再看一下项目的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.pstreets.navigator" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="4" /> <application android:name=".app.GNavigatorApplication" android:icon="@drawable/navigator" android:label="@string/app_name" android:screenOrientation="portrait" android:theme="@android:style/Theme.Black.NoTitleBar" > <activity android:name=".GNavigatorActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.default_searchable" android:value=".search.SearchResultListActivity" /> </activity> <activity android:name=".search.SearchResultListActivity" android:launchMode="singleTop" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> <activity android:name=".AboutActivity" android:launchMode="singleTop" > </activity> <activity android:name=".mapmode.MapModeListActivity" android:launchMode="singleTop" > </activity> <activity android:name=".routing.RoutingActivity" android:launchMode="singleTop" > </activity> <activity android:name=".routing.RouteDetailActivity" android:launchMode="singleTop" > </activity> <activity android:name=".device.ManageDeviceListActivity" android:launchMode="singleTop" > </activity> <activity android:name=".device.AddDeviceActivity" android:launchMode="singleTop" > </activity> <activity android:name=".device.DeviceControlTabActivity" android:launchMode="singleTop" > </activity> <activity android:name=".device.DeviceCommandListActivity" android:launchMode="singleTop" > </activity> <activity android:name=".device.DeviceInfoActivity" android:launchMode="singleTop" > </activity> <activity android:name=".device.DeviceLocationHistoryListActivity" android:launchMode="singleTop" > </activity> <activity android:name=".settings.SettingsActivity" android:launchMode="singleTop" > </activity> <receiver android:name=".sms.SmsMessageReceiver" android:enabled="true" > <intent-filter android:priority="1000" > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> <provider android:name=".search.SearchSuggestionProvider" android:authorities="com.pstreets.navigator.search.SearchSuggestionProvider" /> </application> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_OWNER_DATA" /> <uses-permission android:name="android.permission.WRITE_OWNER_DATA" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /></manifest>
使用的permission 需要有INTERNET(地图API需要访问网络) ,WRITE_EXTERNAL_STORAGE (离线地图需要访问SD卡)其它权限可以根据需要添加。
最后看一下软件的项目目录结构:
项目引用三个库,其中libgisengine.jar 为引路蜂地图API,其它两个为roboguice 库。 支持中英文两种资源 values-zh-rCN 为中文string 资源。