网站被墙,建筑工程信息查询,流量很大的网站,建设摩托车报价及图片最近在开发一个车机上的日历助手#xff0c;其中一个需求就是要实现手机端日历和车机端日历数据的同步。然而这种需求似乎没办法实现#xff0c;毕竟手机日历是手机厂商自己带的系统应用#xff0c;根本不能和车机端实现数据同步的。 那么只能去其他公共的平台寻求一些机会其中一个需求就是要实现手机端日历和车机端日历数据的同步。然而这种需求似乎没办法实现毕竟手机日历是手机厂商自己带的系统应用根本不能和车机端实现数据同步的。 那么只能去其他公共的平台寻求一些机会最后瞄上了邮箱日历的同步方式。大致的架构如下 使用exchange服务中的日历共享机制可以把outlook日历文件通过URL连接的方式发布出来任何客户端都可以去访问这个日历文件做到手机端和车机端上数据的同步。这种方式存在的问题就是
车机端只能是被动的接收不能去做修改需要用户自己去发布日历并且还要把URL字符串自己填到车机里面很繁琐。
但在目前有限的资源情况下此方案是唯一可以落地的。
具体实现步骤
1.日历发布
首先需要有自己的outlook账号并且在web浏览器中访问自己的outlook邮箱账号把自己的邮箱中的日历发布出来会生成一串连接如下
2.手机导入日历
在手机系统日历应用中去订阅这个ICS的的连接。进入日程导入 然后选择URL导入的方式 本来按理说应该使用邮箱账号的方式导入outlook日历的但是就在2024年微软终止了基础方式的登录验证。也就是说对没有升级新的验证方式的软件比如本手机xiaomi系统自带的日历APP只是用账号密码的方式不能登陆上微软的exchange服务器了同步不了数据。 手机应用导入了outlook日历的URL就会定期去同步这个地址的日历数据并导入到自己的系统中。这里便实现了手机日历和outlook日历的同步。
3.车机导入日历
车机日历也要获取到此URL连接才能导入对应的outlook日历。只是在车机端需要我们开发人员自己去实现拉取远程日历文件并解析的过程。
3.1 ICS文件简介
outlook日历使用的是icalendar这种日历数据交互标准RFC 2445icalendar标准定义了描述日历信息的通用格式它内部还分为了很多类型组件比如Events(VEVENT)、To-do(VTODO)、Journal(VJOURNAL)、VTIMEZONE (time zones) 和 VALARM (alarms)等比如下面文件内容 每个事件都会以BEGIN开头以END结束。
3.2下载ICS文件
这并不难在Android端使用Retroft框架然后根据用户填写的发布的URL地址可以轻松实现web服务器的文件下载我这里是先把文件保存到本地然后再从本地加载文件流并读取数据。
3.3解析ICS文件
重点说一下解析ICS文件使用ical4j这个库文件去完成的。 首先需要在整个工程的setting.gradle中添加
dependencyResolutionManagement {repositories {......maven { url https://jitpack.io }}
}然后在module的gradle文件中添加引用
dependencies {......api(org.mnode.ical4j:ical4j:3.2.11) {// exclude modules which are in conflict with system librariesexclude group: commons-loggingexclude group: org.json, module: json// exclude groovy because we dont need itexclude group: org.codehaus.groovy, module: groovyexclude group: org.codehaus.groovy, module: groovy-dateutil}
}这样就可以把对应的jar包加载到项目中。 然后就是提取文件流里面的数据
private fun readCalendarFromInputStream(inputStream: InputStream) {var build CalendarBuilder()var calendar build.build(inputStream)for(i in calendar.components) {when(i) {is VEvent -convertVEvent(i)else - Log.d(TAG, $i)}}}我们这里主要是提取VEvent类型的数据即日历事件这个数据结构中包含了上述日志事件例子中的所有字段信息比如开始时间、结束时间、标题、描述等信息。需要注意的是从outlook上同步过来的icalendar时间都是GMT时区我们需要自己转换成GMT8时区。