# Android-Application-Development **Repository Path**: just1601/Android-Application-Development ## Basic Information - **Project Name**: Android-Application-Development - **Description**: 《安卓应用开发》课程大作业 - **Primary Language**: Android - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 1 - **Created**: 2022-02-24 - **Last Updated**: 2025-03-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # **基于Android的共享车位系统** **摘要**:该系统可为用户提供私家车位共享服务,用户可发布或预定共享的私家车位,对私家车位提供导航定位服务;用户可搜索指定区域周边的共享私家车位。 ## 1.前言 随着汽车消费的持续增长,城市停车设施、规划、管理等方面不够完善,导致机动车停车供需矛盾。而目前大部分住宅小区停车位管理仍然是物业简单粗犷状态,满足的是小区业主自己的停车管理。因此,实现停车方面更加便捷的管理是大势所趋。本文从用户角度出发,基于Android进行共享车位app的开发,主要包括一下几个功能:该系统可为用户提供私家车位共享服务,用户可发布或预定共享的私家车位,对私家车位提供导航定位服务;用户可搜索指定区域周边的共享私家车位。 本次开发采取团队协作形式,采用云服务器进行数据的存储,通过创建数据库将用户等各方面信息存入服务器中。云服务器存储具有以下优势:可用性和可访问性;灾难恢复:云服务器在线存储是企业的完美备份计划。它创建存储的文件的备份。这些文件存储在远程位置,可以随时检索和访问;安全:数据存储在云服务器中,是安全的。使用云服务器存储数据的最佳方式是,将服务器数据分布在冗余服务器上,保存在云服务器中的数据可以防范任何类型的硬件故障。云服务器还提供自动备份和快照,以确保数据是安全的;合作:在线云存储也是一个理想的协作平台。云服务器环境使得多人可以访问、编辑和协作单个文件或文档。人们可以从世界任何地方访问云环境并实时协作。 且使用kotlin语言进行开发,其语言具有如下优势:入门更容易;类型推断;空指针安全;内置的并发支持;减少模板代码(简洁);操纵集合更容易;更智能的垃圾回收等。使用Kotlin语言大约可以减少30%的代码编写,同时也不用再担心空指针异常,由于JetBrains的天然基因,Kotlin可以获得较好的维护、升级。 由于是进行车位共享服务的开发,需要运用到地图显示以及定位等相关功能。本团队采用百度地图SDK来实现相应的功能需求会达到事半功倍的效果。百度地图 Android SDK是一套基于Android 4.0及以上版本设备的应用程序接口。可以使用该套 SDK开发适用于Android系统移动设备的地图应用,通过调用地图SDK接口,可以轻松访问百度地图服务和数据,构建功能丰富、交互性强的地图类应用程序。本团队采取百度地图SDK仅用于学习研究,不进行商业开发,故百度地图Android地图SDK境内服务对非商业目的使用的开发者不收取任何费用,开发者可自行下载放心使用。 目前市面上早已有许多共享车位app,需要满足用户痛点,即在指定目的地可以方便停车,停好车;又要满足各个地区之间的限停限行等条件。需要我们在开发的同时考虑到这些问题。 ## 2.概要设计 ### 2.1. 可行性分析 #### 2.1.1. 观念可行性 “谁能借下车位?就停一小时。”这类信息已经成为小区业主微信群司空见惯的话题。停车难的大环境已经逼迫着车位业主们自行的在共享车位。大家不得不分享自己的车位,每个人都会有朋友亲戚来访,更别说那些没有车位的,更希望有人能把闲置的车位共享出来。 #### 2.1.2. 政策可行性 共享经济下的共享停车,一直被创业者们所看好。而且作为--项与公共事业相关的商业服务,它拥有着国家政策支持的优势。 2015年,国家发改委陆续出台了《城市停车场建设专项债券发行指引》《加快城市停车场建设近期工作要点和任务分工》等多份文件。这些文件无不针对着城市停车场的改造,加强科技创新以改善停车场现况,提高车位利用率。 #### 2.1.3. 技术可行性 信息技术的高速发展,智能手机的普及,车辆识别技术的完善,无不给车位共享提供了有效技术保障。共享单车、共享充电宝、共享汽车等共享经济的产物,他们一个个的成功。从传统硬件和服务模式升级到现在人与人共享资源,合理利用资源的物联网应用开发已经进入成熟阶段。能够简单方便的提供便民服务,而且国家实名制的普及,也更加保障着小程序使用者的安全。只要车位共享小程序与物业车位管理系统联动,人们就能正常租借闲置车位,错时停车。 ### 2.2. 需求分析 共享车位APP主要有以下五个功能性需求:首页、车位预定、车位发布,订单管理和用户中心。 #### 2.2.1. 首页 本APP首页将提供各个功能模块的入口,以及实时的可使用共享车位展示。首页维护的内容包括:地区、搜索栏、实时显示、车位发布入口和用户中心等。 #### 2.2.2. 车位预定 车位预定功能中小程序在首页会根据用户所选地区展示租赁小区信息,也可以通过搜索栏搜索小区。通过点击小区列表进入小区详情页,该页展示该小区所有可租赁车位,选择所需车位即可进行车位预定。 #### 2.2.3. 车位发布 车位发布模块中系统会自动列出用户认证过的所有可发布车位,在选择租赁时间段后进行车位的上架操作,根据车位状态可以看出车位是否被租赁,如果车位未被租赁,发布者可随时选择车位下架。 #### 2.2.4. 用户中心 用户中心功能包括:个人信息、订单管理、车辆管理、车位管理、车主实名认证、我的钱包、我的积分和投诉反馈。 ## 3.详细设计 ### 3.1 总体设计架构 系统总体设计架构 ### 3.2 共享车位系统的实体联系图 共享车位系统的ER图 由上图可知,系统要求用户填写昵称、真实姓名、性别、身份证号、地址等信息,并且会自动生成具有唯一标识的UID;用户能同时拥有多辆车和多个车位,并且能预定其他用户的空闲车位;车辆有车牌号、车型、颜色等属性,车位有其位置和空闲时间等时间,同时记录每辆预定了车位的车占用的时间。 ### 3.3 软件结构 本系统基于Android开发,为用户提供共享车位服务,如图所示,程序端既包括了车位业主的车位发布和车辆使用者的预定车位这两个主要功能,以及订单管理、订单支付、我的钱包、车辆管理、车位管理等次要功能。 软件结构 ### 3.4 数据库设计 本系统采用MySQL数据库设计而成,数据库设计决定了系统能否高效有序的运行。我们应该严格遵守数据库设计准则,正确辨别出系统内实体与实体之间的关系,从而建立实体之间的关系类型,还要确定数据库表中的基本属性和各个数据表的主键与外键,满足数据库设计的相应约束。 我们要在这个给定的应用环境里,构造最优的数据库模式,建立合理的数据库,令它能够高效地存储数据,满足我们的应用需求。 #### 3.4.1 数据库实体设计 综合之前的功能分析和ER图,我们不难的得出本系统所需要的实体。系统主要的实体有用户、车辆、车位、订单、地区等。如表所示,我们可以看到各个实体包含的属性。 表 1 用户表 | 列 | 数据类型 | 功能描述 | | ------------- | --------------------------- | ------------------ | | Uid | character varying(254) | 用户表主键,用户ID | | Nickname | character varying(254) NULL | 用户昵称 | | head_portrait | character varying(254) NULL | 头像 | | login_time | timestamptz NULL | 注册时间 | | name | character varying(254) NULL | 姓名 | | phone | smallint NULL | 联系电话 | 表 2 车位管理表 | 列 | 数据类型 | 功能描述 | | -------- | ---------------------- | -------- | | location | character varying(254) | 车位位置 | | Uid | character varying(254) | 用户ID | | parkID | character varying(254) | 车位ID | | time | timestamptz NULL | 空闲时间 | | booker | character varying(254) | 预约者 | 表 3 车辆管理表 | 列 | 数据类型 | 功能描述 | | --------- | --------------------------- | -------- | | number | character varying(254) | 车辆号牌 | | Uid | character varying(254) | 用户ID | | parkID | character varying(254) NULL | 车位ID | | timestamp | timestamptz NULL | 预定时间 | #### 3.4.2 数据库连接 编写代码实现与数据库的连接,`DatabaseManager类`的设计如下: ```kotlin /** 此DatabaseManager类针对的是目前开发中第一版的数据库设计,而非3.4.1节的数据库实体设计中的总体设计 */ class DatabaseManager { companion object { const val URL = "jdbc:mysql://47.*.*.75:52533/ShareParking" const val USER = "android" const val PASSWORD = "kWoH***8k1uj" const val TABLE = "parking" } private val conn: Connection init { Class.forName("com.mysql.jdbc.Driver") conn = DriverManager.getConnection(URL, USER, PASSWORD) } fun get(): List { val result = mutableListOf() val rs = conn.createStatement().executeQuery("select * from $TABLE") while (rs.next()) { val location = rs.getString("location").split(",") val latitude = location[0].toDouble() val longitude = location[1].toDouble() val booker = rs.getString("booker") val publisher = rs.getString("publisher") val timestamp = rs.getTimestamp("timestamp") val data = DatabaseData(latitude, longitude, booker, publisher, timestamp) result.add(data) } return result.toList() } fun add(data: DatabaseData) { conn.createStatement().execute( "insert into $TABLE\n" + "(location,booker,publisher,timestamp)\n" + "values\n" + "('${data.latitude},${data.longitude}','${data.booker}','${data.publisher}','${data.timestamp}');" ) } fun del(location: String) { conn.createStatement().execute("delete from $TABLE where location='$location'") } fun update(location: String, data: DatabaseData) { del(location) add(data) } } ``` ### 3.5 主要功能设计 #### 3.5.1 车位发布 实现用户点击地图跳出弹窗,可选择发布车位,关键代码如下: ```kotlin val button = Button(context) button.setOnClickListener { val parking = DatabaseData( point.latitude, point.longitude, "", context.id, Timestamp(System.currentTimeMillis()) ) // 向数据库添加车位 Thread { val dbManager = DatabaseManager() dbManager.add(parking) }.start() } button.text = "添加车位" val tv = TextView(context) tv.text = "经度:${point.latitude}\n维度:${point.longitude}" val ll = LinearLayout(context) ll.orientation = LinearLayout.VERTICAL ll.addView(tv) ll.addView(button) val mInfoWindow = InfoWindow(ll, point, -100) bmapView.map.showInfoWindow(mInfoWindow) ``` #### 3.5.2 车位的管理 现实用户对发布的车位进行预定、取消预定、删除车位等操作,关键代码如下: ```kotlin bmapView.map.setOnMarkerClickListener { marker -> val tv = TextView(context) tv.text = "经度:${marker.position.latitude}\n维度:${marker.position.longitude}" val navBtn = Button(context) navBtn.text = "导航" val parking = marker.extraInfo.getParcelable("parking")!! val btn = Button(context) if (context.id == parking.publisher) { btn.text = "删除车位" btn.setOnClickListener { // 从数据库中删除 Thread { val dbManager = DatabaseManager() dbManager.del("${parking.latitude},${parking.longitude}") }.start() } } else if (context.id == parking.booker) { btn.text = "取消预定" btn.setOnClickListener { // 在数据库中取消预定 Thread { val dbManager = DatabaseManager() dbManager.update( "${parking.latitude},${parking.longitude}", DatabaseData( parking.latitude, parking.longitude, "", parking.publisher, Timestamp(System.currentTimeMillis()) ) ) }.start() } } else { btn.text = "预定车位" btn.setOnClickListener { // 在数据库中预定车位 Thread { val dbManager = DatabaseManager() dbManager.update( "${parking.latitude},${parking.longitude}", DatabaseData( parking.latitude, parking.longitude, context.id, parking.publisher, Timestamp(System.currentTimeMillis()) ) ) }.start() } } val ll = LinearLayout(context) ll.orientation = LinearLayout.VERTICAL ll.addView(tv) ll.addView(navBtn) ll.addView(btn) val infoWindow = InfoWindow(ll, marker.position, -100) bmapView.map.showInfoWindow(infoWindow) navBtn.setOnClickListener { navigation(mlocation!!, marker.position, bmapView.map) lastParkingList = listOf() bmapView.map.clear() navigation(mlocation!!, marker.position, bmapView.map) } true } ``` ### 3.6 UI 设计 UI设计采用Compose框架,声明式UI设计。 UI框架图 ## 4.软件测试 测试用例设计及测试结果分析 ### 4.1 数据库测试 单元测试包下,`TestDatabase.kt`: ```Kotlin class TestDatabase { @Test fun testGet() { val dbManager = DatabaseManager() val dataList = dbManager.get() for (data in dataList) { println("data: $data") } } @Test fun testAdd() { val dbManager = DatabaseManager() val data = DatabaseData( "location2", true, "id2", Timestamp(System.currentTimeMillis()) ) dbManager.add(data) } @Test fun testDel() { val dbManager = DatabaseManager() dbManager.del("location2") } } ``` ## 5.心得体会 此次项目为基于Android的车位共享系统开发。 Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后, 继续对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。 本团队根据题目需求,成功开发出了一款简易的车位共享app,其包括了自身定位、显示其他车主添加的车位、预定其他车位、自己添加,删除车位、导航到车位的驾车路线规划、个人用户界面等功能。 采用云服务器进行数据的存储与读取,以达到联网交互的目的。 地图的显示与定位等相关功能使用了百度地图所提供的的SDK工具包,使用此工具包加上官网文档可以开发得更为轻松。 通过此团队项目开发,了解到了如何使用git进行云代码共享与代码修改后的提交;掌握了Android关于如何通过Gradle进行开发包的集成,以方便项目的开发;理解的团队合作的意义与重要性。 存在的问题有:所开发的app功能不多,未完善界面设计的功能。争取以后有机会在真正的项目中进行细而精的开发。 ## 6.参考文献 [1] 秦兴国.Android应用开发实验指导书[M].桂林:桂林电子科技大学,2019. [2] 白喆.Kotlin移动开发技术[M].北京:电子工业出版社,2021.7. [3] 百度地图SDK:https://lbsyun.baidu.com/index.php?title=androidsdk [4] 李刚. 疯狂Android讲义(第三版)[M]. 北京: 电子工业出版社, 2015. [5] 腾讯云. 腾讯云通IM[EB/OL].https://cloud.tencent.com/product/im,2017. ## 7.附录 各核心业务模块程序清单。