当前位置: 首页 > news >正文

车机端同步outlook日历

最近在开发一个车机上的日历助手,其中一个需求就是要实现手机端日历和车机端日历数据的同步。然而这种需求似乎没办法实现,毕竟手机日历是手机厂商自己带的系统应用,根本不能和车机端实现数据同步的。
那么只能去其他公共的平台寻求一些机会,最后瞄上了邮箱日历的同步方式。大致的架构如下:
在这里插入图片描述
使用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 2445),icalendar标准定义了描述日历信息的通用格式,它内部还分为了很多类型组件,比如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-logging'exclude group: 'org.json', module: 'json'// exclude groovy because we don't need itexclude group: 'org.codehaus.groovy', module: 'groovy'exclude 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时区,我们需要自己转换成GMT+8时区。

相关文章:

车机端同步outlook日历

最近在开发一个车机上的日历助手,其中一个需求就是要实现手机端日历和车机端日历数据的同步。然而这种需求似乎没办法实现,毕竟手机日历是手机厂商自己带的系统应用,根本不能和车机端实现数据同步的。 那么只能去其他公共的平台寻求一些机会&…...

教学案例:k相同的一次函数的图像关系

【题目】 请在同一个平面直角坐标系中画出一次函数y2x, y2x4的图象,并观察图象,你发现这两个图形有什么位置关系?为什么? 【答案】 图象是相互平行的两条直线 【解析】 一、教学活动形式 这里设计的教学活动形式是“画图 →…...

EmoAva:首个大规模、高质量的文本到3D表情映射数据集。

2024-12-03,由哈尔滨工业大学(深圳)的计算机科学系联合澳门大学、新加坡南洋理工大学等机构创建了EmoAva数据集,这是首个大规模、高质量的文本到3D表情映射数据集,对于推动情感丰富的3D头像生成技术的发展具有重要意义…...

Elasticsearch vs 向量数据库:寻找最佳混合检索方案

图片来自Shutterstock上的Bakhtiar Zein 多年来,以Elasticsearch为代表的基于全文检索的搜索方案,一直是搜索和推荐引擎等信息检索系统的默认选择。但传统的全文搜索只能提供基于关键字匹配的精确结果,例如找到包含特殊名词“Python3.9”的文…...

【Flink-scala】DataStream编程模型之水位线

DataStream API编程模型 1.【Flink-Scala】DataStream编程模型之 数据源、数据转换、数据输出 2.【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 3.【Flink-scala】DataStream编程模型之 窗口计算-触发器-驱逐器 文章目录 DataStream API编程模型前言…...

Python导入moviepy找不到editor 视频没有声音设置audio_codec参数

moviepy合成视频出错: 问题一:导入moviepy.editor找不到editor,No module named moviepy.editor问题二:合成的视频没有声音 问题一:导入moviepy.editor找不到editor,No module named moviepy.editor from …...

rsync 是一个非常强大的 Linux 工具,常用于文件和目录的同步、备份和传输。

rsync 是一个非常强大的 Linux 工具,常用于文件和目录的同步、备份和传输。它可以高效地同步本地和远程系统上的文件和目录,并且支持增量传输,仅同步发生变化的部分。rsync 支持压缩传输、删除多余文件、排除特定文件等多种功能,是日常运维、备份和迁移数据的重要工具。 一…...

触发器案例详解

目录 一、定义二、类型三、功能与用途四、创建与调用DML触发器格式示例DDL触发器格式示例登录触发器格式示例五、案例案例一:DML触发器 - 记录更新操作的触发器案例二:DML触发器 - 防止非法工资更新的触发器案例三:DDL触发器 - 记录表结构更改的触发器案例四:DDL触发器 - 防…...

jwt 与 sessionid 的区别及应用场景

在现代 Web 应用中,JWT(JSON Web Token)和SessionID是两种常用的用户认证和状态管理机制。本文从两者的原理、区别、优缺点以及适用场景展开分析,结合常见问题提出了最佳实践建议,帮助开发者更好地选择和使用。 JWT与S…...

tomcat和nginx

Tomcat 和 Nginx 都可以部署 Web 应用,但它们的核心功能和适用场景不同,因此在 2024 年生产环境及未来,是否使用 Tomcat 取决于需求和技术架构的特点。 1. Tomcat 的特点与适用场景 Tomcat 是 Java Servlet 容器,主要用来运行基于…...

服务器带宽与数据安全的重要性与作用

服务器带宽指的是服务器与外部网络通信的能力,即服务器发送和接收数据的速率。带宽越大,服务器在同一时间内能够处理的数据量就越多,数据传输的速度和稳定性也就越高。在数字化时代,企业对于数据的依赖程度日益加深,无…...

JSON数据处理

1. JSON注解 Data NoArgsConstructor AllArgsConstructor JsonIgnoreProperties(ignoreUnknowntrue) JSON注解: JsonIgnoreProperties(ignoreUnknowntrue) Hutool 日期格式化: DatePattern DateTimeFormat(pattern "yyyy-MM-dd HH:mm:ss")…...

FSWIND脉动风-风载时程生成器软件原理

大量风的实测资料表明,在风的时程曲线中,瞬时风速包含两个部分:一部分是自振周期一般在 10 分钟以上的平均风,另一部分是周期一般只有几秒左右的脉动风。平均风由于其周期一般比结构的自振周期大,因而考虑其作用性质相…...

搭建高可用负载均衡系统:Nginx 与云服务的最佳实践

搭建高可用负载均衡系统:Nginx 与云服务的最佳实践 引言 在项目开发过程中,我们通常在开发和测试阶段采用单机架构进行开发和测试。这是因为在这个阶段,系统的主要目的是功能实现和验证,单机架构足以满足开发人员的日常需求&…...

对比git命令与TortoiseGit工具,理解git解决冲突的过程

1 引言 此前用TortoiseSvn习惯了,所以,转到git时也同时选择了TortoiseGit工具。 同时,对比了可视化工具和git命令的操作,来深入理解git解决冲突的方式。 2 使用远程仓库替代本地仓库的内容 2.1 TortoiseGit做法 using “MERGE_…...

guava缓存的get方法的回调函数讲解一下

CacheBuilder.newBuilder()//设置缓存初始大小,应该合理设置,后续会扩容.initialCapacity(10)//最大值.maximumSize(100)//并发数设置.concurrencyLevel(5)//缓存过期时间,写入后10分钟过期.expireAfterWrite(600,TimeUnit.SECONDS)//统计缓存…...

React基础知识四 Hooks

什么是hooks? (coderwhy) hooks是react 16.8(2019年)出的新特性。 react有两种形式来创建组件——类式和函数式。在hooks之前类式组件就是react最主流的编程方式。 这个时候,函数式组件是非常鸡肋的,几乎没什么用。因…...

线性代数中的谱分解

一、谱分解的基本原理 谱分解(Spectral Decomposition)是线性代数中的一个重要概念,特别是在研究矩阵的特征值和特征向量时。它指的是将一个矩阵分解为其特征值和特征向量的组合,从而简化矩阵的运算和分析。谱分解通常适用于对称…...

Redis 数据结结构(一)—字符串、哈希表、列表

Redis(版本7.0)的数据结构主要包括字符串(String)、哈希表(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)、超日志&#xff08…...

【Python】用Python和Paramiko实现远程服务器自动化管理

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代IT环境中,远程服务器管理已成为运维工作的常态。随着自动化运维的需求不断增加,如何高效地管理远程服务器,提升操作的灵活性和效率…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

【JavaEE】-- HTTP

1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

GitHub 趋势日报 (2025年06月08日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...