个人出行信息管理系统的设计与实现
扫描二维码
随时随地手机看文章
引言
在电子地图领域除了做导航方面的公司以外 ,还有许多公司在做综合旅游服务 , 比如去哪儿旅行、携程旅行、同程旅游和途牛旅游等 ,这些产品针对的是旅游业中人们的需求。以前的旅游基本是人们亲自去挑选旅行社和导游 ,而现在人们则可以很方便地通过自己手中的智能手机打开这些APP来进行自己的旅游规划 , 这就为本文的设计提供了思路 , 既要避其锋芒 ,又要曲径通幽 ,使用电子地图来为人们提供不一样的服务。
正是发现了人们在日常出行信息管理方面的需求 ,我们决定将研究方向瞄准这些方面 。其实这种用于人们日常生活中的看似可有可无的移动应用有些时候往往能很好地填补人们的空闲时间 ,可以为人们的日常出行添姿加彩 ,从某种角度看本系统很好地满足了许多用户的隐性需求。
1 个人出行信息管理系统技术原理
1. 1 开源地图openStreetMap
openSsreesMap(OSM)被称作电子地图中的维基百科 , 是一个网络电子地图的合作计划 , 目的是想建立一个内容广泛而且可以让所有人进行编辑的世界范围的地图。
OSM在Android系统中的应用被集成在了OSMDroid 中 ,开发者将相关的包导入到自己的项目中即可在代码中调用其相关方法 。鉴于OSM资源的完全免费 ,开发者在使用OSMDroid 时不需要像使用其他大公司地图时一样申请相关的APIkey,只要在导入相关包之后开发者便可实现许多基本的地图服务 , 比如定位、搜索、标记、路径规划、离线地图等功能。
1.2 关键Java类及函数
本文中一些功能是需要获取网络数据的 ,这样就会有一定的延时 ,所以不可以在主线程中直接调用 , 需要子线程或采用异步的方式。Android中有一种特有的异步类可以解决本文中遇到的绝大多数网络延时问题 , 即AsyncTask 。简单说来就是在UI主线程运行时 ,通过异步方式完成一些操作 ,AsyncTask 允许后台执行一个异步任务 ,可以将比较耗时的操作放在异步任务当中来执行 ,并随时将任务执行的结果返回给UI线程来更新UI控件 。所以 ,AsyncTask往往可以轻松解决多线程之间的通信问题。
另外 ,在实现相册功能的时候要解决图片显示时文件内容过大以及文件数目过多而产生的otsofMemory(ooM)异常的问题 ,本文是使用外部类ImageLoader以及异步处理的方式来进行解决的 。ImageLoader的工作原理大致是:在显示图片的时候 ,它会先在内存中进行查找 , 内存中找不到就会去本地查找 ,如果依然没有找到就建立一个新的线程来下载这张图片 ,然后会把下载成功的图片同时缓存到内存和本地 。另外 ,因为ImageLoader对图片采用的是软引用的形式 ,所以内存中的图片会在内存不足的时候被系统回收(内存足够的时候不会对其进行垃圾回收) 。
1.3 功能模块设计概述
本文研究的产品主要实现以下几个功能模块:定位功能模块、地点搜索功能模块、路径规划功能模块、拍照功能模块、行程管理功能模块、时间轴功能模块、相册功能模块(图1) 。
(1)行程管理功能模块:本研究的主题便是对用户的出行信息进行管理 ,用户可自行设定行程主题及时间 , 点击开始行程后即可通过拍照记录行程状态以及位置信息 ,所拍照片会自动存储到所对应行程主题文件夹下 ,并在相册中对应显示相关信息。用户也可以在未创建行程的情况下使用拍照功能 ,此时会将照片默认存储于以当天日期为名创建的文件夹下 ,同时也会自动记录位置信息 ,相册中显示的照片信息即为无主题。
(2)时间轴功能模块:用户在点击时间轴按钮后会在地图界面标注出用户在近1一天内到过的所有位置 ,记录下用户这些天的足迹。用户在拍照时应用会自动记录用户的位置信息 ,然后把近1一天的位置信息挑选出来标注在地图上。
(3)相册功能模块:本模块将用户所拍照片进行集中展示 ,界面设计类似于相册 ,用户可以浏览自己拍过的照片 ,这些照片会自动对应显示主题和时间信息 ,用户也可在照片下方为照片添加文字介绍。
2 个人出行信息管理系统的具体实现
2. 1 相册功能模块的实现与测试
本文的相册功能主要是由用户所拍照片经应用分类存储后进行展示 ,本模块的实现流程图如图2所示。
2. 1. 1 照片存储功能的实现
为了实现照片的存储功能 ,本文设定在每次打开应用时都会执行一个功能函数 , 即创建一个以当前日期为名的文件夹 ,这样就可以让不在行程中的用户所拍照片找到存储的路径。
getPhotoFileName()这个函数的功能就是给所拍照片命名 ,从代码中可以了解到本文是使用当前时间为照片命名的 ,时间要精确到秒 ,这样才可以保证照片文件不同名。
getsDPath()函数的作用是将照片分两种情况进行存储 ,如果用户正在行程中便会存储到以当前行程名称命名的文件夹中去 ,如果用户未在行程中则会将照片存储到以当前日期命名的文件夹中去 。这里用到了sharedPreferences来存储行程 的状态以及行程的名称 ,这样就可以在不同的Activity之间共同使用这些数据 ,而且关闭应用再打开后数据不会重置。
行程的状态即是否处于行程中 , 以及行程主题名称相关的数据信息要存储在sharedPreferences中 ,这样在每次打开程序时都可以从文件中读取相关数据。
2. 1.2 处理照片文件以防ooM现象
在行程管理的UI界面本文设计了一个在屏幕上半部分轮播显示每次行程中的一 张照片的功能 ,如果直接读取原文件显示到屏幕上很可能导致ooM情况。本文最先做的工作便是处理照片原文件 ,对其进行压缩处理使之能够以合适的文件大小显示到屏幕上而不会造成ooM现象。这里主要使用到了decodeBitmapFromFile和calculatesamplesize两个函数:在decode一BitmapFromFile函数中用到了BitmapFactory.options ,首先要将options .inJustDecodeBounds设置为true , 这个时候从所给路径中获取图片时只是获取图片的属性信息而不会真正地耗费内存去加载图片 ,然后使用options.insamplesize=calculatesample一 size(options,400,200)这句代码对所选图片进行压缩处理 , 其中calculatesamplesize(options,400,200)的参数可以 自行设定 。接着将options.inJustDecodeBounds设置为false ,这样程序就会去加载已经经过处理的照片了。
2.1.3 自定义照片简介功能的实现
要将接收到的主题和时间数据显示到对应的文本框中是由目前的position来确定的 , 上面的代码通过取余的操作使 position得以循环 ,对应的数据信息也成功地显示在了正确位置。相册的最后一个功能是自定义照片简介 ,其实前述代码中已经透露了这个功能的实现方式 ,不像显示主题和时间一样可以使用List数组作为容器 ,这里需要使用HashMap来存储照片的简介信息 。 因为简介不一 定每张照片都会有 , 所以其 position是不连续的 ,使用for循环无法实现照片与简介的对应显示 ,而HashMap可以很好地解决这一 问题。
点击保存按钮时将当前照片position对应的简介信息存储到对应的HashMap中 ,这个HashMap的key是整型的 ,用于存储 position:value是string类型的 ,用于存储文字简介信息。
2.2 行程管理功能模块的实现与测试
本模块主要功能为对用户行程信息的管理 ,模块流程图如图3所示。
sharedPreferences是Android平台上一个轻量级的存储类 ,可以存储一些配置信息或者一些简单的数据信息 。本文使用sharedPreferences来存储行程状态等数据信息。
点击出发按钮首先会判断用户当前是否处于行程中 ,若已处于行程之中会在屏幕下方弹出Toast语句提醒用户已在行程中 ,如果未处于行程中则会进入创建行程语句。若要开始行程需要输入行程的主题以及时间 , 否则会提示用户要先将信息输入完整 ,一切准备就绪之后便会开始创建行程。这里需要创建此次行程对应的文件夹以及将此次行程的主题和时间分别存储到sharedPreferences中并进行编号 ,编号是为了可以在实现轮播显示每次行程的一张照片的功能时可以获取到每次行程的文件夹名称 。最后还需要将行程状态设置为在行程中, 实现逻辑上的完整 ,然后要在屏幕下方弹出Toast语句提醒用户行程已开始。
时间轴功能用于在地图上显示用户近l4天内的出行坐标点 ,这个功能涉及Activity之间的数据传输问题 ,在点击地图界 面 的 按 钮 跳 转 到 行 程 管 理 界 面 时 使 用 了 startActivity一 ForResult()的函数 ,就可以在点击时间轴按钮时实现其功能 。在点时间轴按钮后会跳转到地图界面 , 同时地图界面的onActivityResult函数负责接收信息 。
3 成果展示
图4、图5展示了相册功能。
行程管理和时间轴功能成果图如图6、图7所示 。
4 结语
本研究从最基础的实时定位功能、地点搜索功能、路径规划功能做起 ,给用户提供电子地图类应用的基础服务:然后在此基础上实现对行程的管理 ,包括开始行程、设置行程主题和 时间、结束行程等功能 ,还可以提供时间轴的功能来显示用户 最近一段时间的足迹:最后还实现了相册的功能 ,可以存储并 显示用户在行程中所拍摄的照片 。本系统在相关应用的一些功能实现方面提供了解决方法 ,并且提出了在行程管理领域的一种手机服务模式 ,具有一定的应用和发展前景。