安卓谷歌日历 "无法启动事件"

6
案例1 我在亚马逊AWS上托管了一个iCal.ics文件的日历事件,并将其HTTP URL集成到我的Android应用程序中。 这是文件 当用户点击URL时,会显示一个意图选择器,其中包含以下选项:
  • 日历应用程序
  • 下载文件的浏览器
当我选择Google日历时,它会给我一个错误,说“无法启动事件”。
当我选择Chrome时,文件会被下载,当用户单击下载的文件时,它会给出相同的错误“无法启动事件”。
以下是使用桌面Chrome http客户端Postman下载文件时的响应标头。
Accept-Ranges → bytes
Content-Length → 959
Content-Type → application/octet-stream
Date → Thu, 10 Mar 2016 13:45:10 GMT
ETag → "5d48719213395a28e09e8adf01f6ce83"
Last-Modified → Wed, 09 Mar 2016 15:24:22 GMT
Server → AmazonS3
x-amz-id-2 → XXXXXXXXXXXXXXXXXXXXXXXXX
x-amz-request-id → XXXXXXXXXXXXXXXXXXX
案例二 为了进行实验,我在本地Apache服务器上编写了一个简单的PHP脚本,用于下载相同的文件,而不是直接从HTTP URL访问文件。

PHP代码

<?php
$file = $_GET['file'];
if (file_exists($file)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        ob_clean();
        flush();
        readfile($file);
        exit;
    }
?>

文件已成功下载,然后

  • 点击下载的文件
  • 从意图选择器中选择Google日历
  • 在Google日历中成功添加事件

使用PHP脚本时以下是响应头

Cache-Control → must-revalidate, post-check=0, pre-check=0
Connection → Keep-Alive
Content-Description → File Transfer
Content-Disposition → attachment; filename=World_Television_Premiere_of_House_Of_Cards_March_1213_5pm_on_Zee_Cafe.ics
Content-Length → 959
Content-Transfer-Encoding → binary
Content-Type → application/octet-stream
Date → Thu, 10 Mar 2016 07:27:15 GMT
Expires → 0
Keep-Alive → timeout=5, max=100
Pragma → public
Server → Apache/2.4.7 (Ubuntu)
X-Powered-By → PHP/5.5.9-1ubuntu4.14

请问为什么事件在第一种情况下无法保存或工作?

提前感谢您的帮助。

编辑

Android 设备:Nexus 6 (6.0.1)

Google 日历应用程序:5.3.6-115544951-release


似乎在日历产品论坛的帖子中正在讨论此问题:https://productforums.google.com/forum/#!topic/calendar/VWK6yg3xBVc - adjuremods
你还能通过流媒体的方式打开吗?因为这种方式对我来说行不通。只有当我从Gmail内部打开ICS文件时才有效。如果我尝试以其他方式打开ICS,就会出现“无法启动事件”的错误。你有一个可以测试的URL吗?谢谢! - jnl
4个回答

3
我曾遇到一个类似的问题,我的网络应用程序创建了一个.ics文件。桌面版gmail可以正常处理该文件,但在Android设备上打开附件时会出现“无法启动事件”的错误。Google Calendar为其邀请邮件生成的ICS文件可以正常工作,因此我进行了二进制搜索并找出了问题所在:我的ICS文件缺少DTSTAMP属性。该属性是强制性的,因此移动应用程序错误地抱怨了,我只希望错误消息更具信息性。

教训是:网络应用程序可能比移动应用程序更宽松,因此不要因为它在其中一种应用中正常工作而假设您拥有标准的正确实现。


1

目前 - 我们说的是2016年4月27日 - 这个提供的文件在我的Google日历Android版v.5.4-1198上可以正常打开... 但我曾经遇到过类似的问题,后来发现Google日历无法导入带有BOM的UTF-8格式的.ics文件。现在我将它们从服务器发送为无BOM的UTF-8格式,一切都很好。


0

虽然这不是@Vishal Vyas遇到的问题,但我们发现一个可能性是DESCRIPTION字段不能包含HTML标签。

例如,如果您有以下ical文件,在Outlook、Gmail等PC上可以正常工作,但在Android手机上无法正常工作(对于iPhone不确定)。

BEGIN:VCALENDAR
PRODID:-//Test//Test//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
DTSTART:20220622T200000Z
DTEND:20220622T203000Z
DTSTAMP:20220622T000415Z
ORGANIZER;CN=Test:mailto:noreply@example.com
UID:noreply@example.com
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=FALSE;CN=g g;X-NUM-GUESTS=0:mailto:mygmailaccount@gmail.com
CREATED:20220622T000415Z
DESCRIPTION:<table style="width:1000px"><tbody><tr><td><p>Thank you for making a booking.</p></td></tr></tbody></table>
LOCATION:Room 1
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Demo ICS - Room 1
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR

请注意,DESCRIPTION字段包含一个<table>标记。这似乎引起了“无法启动事件”的错误。

0
在第一种情况下,您可能希望将Content-Type设置为text/calendar。
在第二种情况下,事情确实起作用,因为您正在传递一个以.ics结尾的文件名的content-disposition。因此,客户端可以从扩展名推断格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接