车机端同步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 libraries
        exclude group: 'commons-logging'
        exclude group: 'org.json', module: 'json'
        // exclude groovy because we don't need it
        exclude 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时区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/930432.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始学TiDB(1) 核心组件架构概述

首先TiDB深度兼容MySQL 5.7 1. TiDB Server SQL语句的解析与编译:首先一条SQL语句最先到达的地方是TiDB Server集群,TiDB Server是无状态的,不存储数据,SQL 发过来之后TiDB Server 负责 解析,优化,编译 这…

Linux絮絮叨(三) Ubuntu桌面版添加中文拼音输入法

步骤很详细,直接上教程 一. 配置安装简体拼音输入法 #安装相应的平台支持包 sudo apt install ibus-gtk ibus-gtk3# 安装简体拼音输入法 sudo apt install ibus-pinyin安装完成如果下面的步骤找不到对应输入法可以重启一下,一般不需要 二. 添加简体拼音…

RTCMultiConnection 跨域问题解决

js套件地址 https://github.com/muaz-khan/RTCMultiConnection server套件地址 https://github.com/muaz-khan/RTCMultiConnection-Server 要解决的就是server代码的跨域问题 原装写法: 解决写法: // 喜欢组合语法的自己组 const io new ioServer.S…

在 Zemax 中使用 CAD 镜头的逆向血眼模型

Zemax 中的眼睛模型涉及模拟人眼的光学特性。该模型通常包括代表角膜、晶状体、房水、玻璃体和视网膜的各种成分。 屈光不正的眼睛是具有屈光不正的眼睛,这意味着它不能将光线正确聚焦在视网膜上,导致视力模糊。屈光不正是存在屈光不正的状态&#xff0…

WebStorm快捷键保持跟Idea一致

修改连续行局部多选 在WebStorm中同时按下ctrl alt s; 选择KeyMap 输入Column Selection Mode选择快捷键, 右键选择Add Mouse Shortcut 按下alt 鼠标左键 如果出现占用的情况,直接删除其他使用该快捷键的地方即可; 修改跨行局部多选 在…

如何查看电脑的屏幕刷新率?

1、按一下键盘的 win i 键,打开如下界面,选择【系统】: 2、选择【屏幕】-【高级显示设置】 如下位置,显示屏幕的刷新率:60Hz 如果可以更改,则选择更高的刷新率,有助于电脑使用起来界面更加流…

【AI模型对比】Kimi与ChatGPT的差距:真实对比它们在六大题型中的全面表现!

文章目录 Moss前沿AI语义理解文学知识数学计算天文学知识物理学知识英语阅读理解详细对比列表总结与建议 Moss前沿AI 【OpenAI】获取OpenAI API Key的多种方式全攻略:从入门到精通,再到详解教程!! 【VScode】VSCode中的智能AI-G…

WPF编写工业相机镜头选型程序

该程序满足面阵和线阵的要求。 前端代码 <Window x:Class"相机镜头选型.MainWindow" Loaded"Window_Loaded"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml…

若依 ruoyi VUE el-select 直接获取 选择option 的 label和value

1、最新在研究若依这个项目&#xff0c;我使用的是前后端分离的方案&#xff0c;RuoYi-Vue-fast(后端) RuoYi-Vue-->ruoyi-ui(前端)。RuoYi-Vue-fast是单应用版本没有区分那么多的modules 自己开发起来很方便&#xff0c;这个项目运行起来很方便&#xff0c;但是需要自定义的…

【深入探索 C++ STL 双端队列 】deque —— 数据时空的双端虫洞,扭曲常规操作的效率边界

STL系列专栏&#xff1a; C STL系列__Zwy的博客-CSDN博客https://blog.csdn.net/bite_zwy/category_12838593.html?spm1001.2014.3001.5482学习C STL的三个境界&#xff0c;会用&#xff0c;明理&#xff0c;能扩展&#xff0c;STL中的所有容器都遵循这个规律&#xff0c;下面…

DevOps系统设计和技术选型

命名是一件痛苦的事情&#xff0c;除非你不想要一个好名字。 我正在做的这个管理系统叫什么合适&#xff0c;或者是什么类型的系统&#xff0c;想去想来不知所措&#xff0c;后来想想这么小的东西纠结什么&#xff0c;先从小的细节一点点来&#xff0c;能用就行&#xff0c;就用…

20241206-Windows 10下使用IDEA 2024.2.3(JDK 18.0.2.1)搭建Hadoop 3.3.6开发环境

Windows 10下使用IDEA 2024.2.3(JDK 18.0.2.1)搭建Hadoop 3.3.6开发环境 1. 配置好本地hadoop之后 2. idea 新建或导入 Maven 项目 3. 编写 pom.xml 文件: 有些版本和项目信息需要根据自己的项目进行调整 JDK 18.0.2.1 Hadoop 3.3.6 <?xml version"1.0" encod…

C#Treeview

创建一个Windows应用程序&#xff0c;在默认窗体中添加一个TreeView控件、一个ImageList控件和一个ContextMenuStrip控件&#xff0c;其中&#xff0c;TreeView控件用来显示部门结构&#xff0c;ImageList控件用来存储TreeView控件中用到的图片文件&#xff0c;ContextMenuStri…

pytorch多GPU训练教程

pytorch多GPU训练教程 文章目录 pytorch多GPU训练教程1. Torch 的两种并行化模型封装1.1 DataParallel1.2 DistributedDataParallel 2. 多GPU训练的三种架构组织方式2.2 数据不拆分&#xff0c;模型拆分&#xff08;Model Parallelism&#xff09;2.3 数据拆分&#xff0c;模型…

使用el-row和el-col混合table设计栅格化,实现表头自适应宽度,表格高度占位

演示效果&#xff1a; 如上图,由于地址信息很长,需要占多个格子,所以需要错开,若想实现这种混合效果,可以这样搭建: 页面效果&#xff1a; 代码分析: 上面使用el-row和el-col搭建表单显示 第一排三个8,第二排8和16 下面混合table实现&#xff0c;并使用border来自适应宽度…

WPS解决Word文件引入excel对象文件无法打开提示“不能启动此对象...”的问题

一、问题现象 接收到了一份 Word文件&#xff0c;里面引入了一个Excel对象文件&#xff0c;双击时候&#xff0c;wps出现卡顿&#xff0c;过一会之后弹出错误提示&#xff1a;不能启动此对象... 二、解决方法 1.点击WPS左上角图标&#xff0c;并打开右上角设置&#xff0c;萱蕚…

JAVA (Springboot) i18n国际化语言配置

JAVA i18n国际化语言配置 一、简介二、功能三、Java配置国际化步骤四、Java国际化配置工具类五、Spring Boot配置六、测试 一、简介 在Java中&#xff0c;国际化&#xff08;Internationalization&#xff0c;通常简称为i18n&#xff09;是一个过程&#xff0c;它允许应用程…

Jenkins 中自定义Build History中显示构建信息

有时候会遇到一个代码仓库下面会有多个不同的分支&#xff0c;而这写分支表示着不同的开发者在开发新的需求&#xff0c;但是这样就会出现一个问题&#xff0c;在Jenkins上进行多分支构建的时候&#xff0c;很难找到哪一个是属于自己分支构建的&#xff0c;这样的问题大家应该都…

springboot安康旅游网站的设计与实现(代码+数据库+LW)

目 录 目 录 摘 要 Abstract 第一章 绪论 1.1 研究现状 1.2 设计原则 1.3 研究内容 第二章 相关技术简介 2.1 JSP技术 2.2 Java技术 2.3 MYSQL数据库 2.4 B/S结构 2.5 Spring Boot框架 第三章 系统分析 3.1可行性分析 3.1.1技术可行性 …

asp.net core过滤器应用

筛选器类型 授权筛选器 授权过滤器是过滤器管道的第一个被执行的过滤器&#xff0c;用于系统授权。一般不会编写自定义的授权过滤器&#xff0c;而是配置授权策略或编写自定义授权策略。简单举个例子。 using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCo…