目 录
摘 要 I
Abstract II
第一章 绪 论 1
1.1 课题来源 1
1.2 研究背景和存在问题 1
1.2.1 手机导航背景 1
1.2.2 手机导航面临的问题 2
1.3 研究目标和方法 2
1.3.1 研究的目标 2
1.3.2 研究的方法 3
1.4 本文的内容安排 4
第二章 手机导航软件现状和各种技术选择依据 6
2.1手机导航的发展和未来 6
2.2 Google Maps的选择 7
2.3 Android 技术选择 9
2.3.1开发背景 9
2.3.2 android平台和其他平台比较 10
2.3.3 选择依据 13
2.4 本章小结 14
第三章 需求分析 15
3.1 功能性需求分析 15
3.1.1 地图管理 15
3.1.2 轨迹管理 16
3.1.3规划导航路径 17
3.1.4远程跟踪监视 18
3.2 界面需求分析 18
3.3数据存储需求 19
3.4 环境需求 20
3.5本章小结 20
第四章 Android手机导航的总体设计 21
4.1 系统功能模块划分 21
4.2 系统架构设计 22
4.3用户界面设计 23
4.4 本章小结 25
第五章 数据存储设计 27
5.1数据存储设计原理 27
5.2数据库存储实现 27
5.2.1 数据库和数据表的创建和打开 27
5.2.2 对数据表的操作 31
5.3 使用SharePreference存储 33
5.3 本章小结 34
第六章 系统子模块的设计和实现 35
6.1地图管理模块的实现 35
6.1.1 在线地图 35
6.2.2 任意界面的缩放 36
6.2.3 随时定位个人位置 37
6.2.4 调整地图偏移 38
6.2.5 保持跟踪 39
6.2轨迹管理模块的实现 39
6.2.1 新建跟踪记录 39
6.2.2 地图展示 40
6.2.3 查询以往轨迹 42
6.2.4 显示轨迹信息 43
6.3 规划导航路径模块实现 43
6.3.1 已知经纬度查询 43
6.3.2 地址反查 44
6.3.3规划导航路径 45
6.4本章小结 45
第七章 系统测试 46
7.1地图管理模块测试 46
7.1.1 在线地图 46
7.1.2 地图的缩放 47
7.1.3 定位个人位置 47
7.1.4 保持跟踪 48
7.1.5 调整地图偏移 48
7.2轨迹管理模块测试 49
7.2.1 新建跟踪界面 49
7.2.2 显示过往所有轨迹 49
7.2.3 地图展示轨迹 50
7.2.4 路径信息 50
7.3 规划导航模块测试 51
7.3.1 经纬度查询 51
7.3.2 地址查询 51
7.3.3 选择地图模式 52
7.3.4调用手机内置地图规划导航路径 52
7.4 本章小结 53
结论 54
总结 54
展望 54
参考文献 56
致谢 58
1.3研究目标和方法
1.3.1研究的目标
本系统的主要功能包括手机实时定位,指定地点的寻址,规划导航路径,个人位置跟踪、监视、展示的应用程序。
一、地图管理
1.在线地图
2.离线地图(SQLite 数据库存储)
3.任意界面的地图缩放
4.随时定位个人位置
5.调整地图偏移
6.保持跟踪,随时显示
二、轨迹管理
package com.xlkj.gps;
import java.util.List;
import com.xlkj.gps.R;
import com.xlkj.gps.maps.db.DAO;
import com.xlkj.gps.maps.db.GeoBookmark;
import com.xlkj.gps.maps.ui.AddBookmarkDialog;
import com.xlkj.gps.maps.ui.OnDialogClickListener;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.AdapterView.OnItemLongClickListener;
public class AllGeoBookmarks extends ListActivity {
private static final String BOOKMARK_DATA = "bookmark";
private List geoBookmarks;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setData();
}
private void setData() {
DAO dao = new DAO(this);
geoBookmarks = dao.getBookmarks();
setListAdapter(new GeoBookmarkListAdapter(this));
getListView().setOnItemLongClickListener(new OnItemLongClickListener(){
public boolean onItemLongClick(AdapterView> parent, View view,
int position, long id) {
Intent intent = new Intent();
intent.putExtra(BOOKMARK_DATA, geoBookmarks.get(position));
setResult(RESULT_OK,intent);
finish();
return false;
}
});
}
/**
* Создает элементы меню
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, 0, 0, R.string.EDIT_MENU).setIcon(R.drawable.edit);
menu.add(0, 1, 0, R.string.DELETE_MENU).setIcon(R.drawable.delete);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
boolean isSelected = this.getSelectedItemId() >= 0;
menu.findItem(0).setEnabled(isSelected);
menu.findItem(1).setEnabled(isSelected);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
final int bookmarkId = (int) this.getSelectedItemId();
switch (item.getItemId()) {
case 0: // edit
AddBookmarkDialog.show(AllGeoBookmarks.this,
geoBookmarks.get(bookmarkId), new OnDialogClickListener() {
@Override
public void onCancelClick() {
}
@Override
public void onOkClick(Object obj) {
GeoBookmark geoBookmark = (GeoBookmark) obj;
DAO d = new DAO(AllGeoBookmarks.this);
d.saveGeoBookmark(geoBookmark);
setData();
}
});
break;
case 1: // delete
new AlertDialog.Builder(this).setTitle(R.string.REMOVE_BOOKMARK_TITLE)
.setMessage(R.string.REMOVE_BOOKMARK_MESSAGE)
.setPositiveButton(R.string.YES_LABEL,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
DAO dao = new DAO(AllGeoBookmarks.this);
dao.removeGeoBookmark(geoBookmarks.get(bookmarkId).getId());
setData();
}
}).setNegativeButton(R.string.NO_LABEL, null).show();
break;
default:
break;
}
return true;
}
private class GeoBookmarkListAdapter extends BaseAdapter {
public GeoBookmarkListAdapter(Context context) {
mContext = context;
}
public int getCount() {
return geoBookmarks.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
GeoBookmarkView sv;
GeoBookmark bookmark = geoBookmarks.get(position);
if (convertView == null) {
sv = new GeoBookmarkView(mContext, bookmark.getName(), bookmark.getDescription());
} else {
sv = (GeoBookmarkView) convertView;
sv.setName(bookmark.getName());
sv.setDescription(bookmark.getDescription());
sv.id = bookmark.getId();
}
return sv;
}
private Context mContext;
}
public class GeoBookmarkView extends LinearLayout {
public GeoBookmarkView(Context context, String name, String description) {
super(context);
View v = View.inflate(AllGeoBookmarks.this, R.layout.geobookmark, null);
nameLabel = (TextView) v.findViewById(android.R.id.text1);
nameLabel.setText(name);
descriptionLabel = (TextView) v.findViewById(android.R.id.text2);
descriptionLabel.setText(description);
addView(v);
}
public void setName(String name) {
descriptionLabel.setText(name);
}
public void setDescription(String description) {
descriptionLabel.setText(description);
}
protected long id;
private TextView nameLabel;
private TextView descriptionLabel;
}
}