Xamarin.Forms Android - 无法将事件添加到日历"我的日历"编程

时间:2017-03-23 22:24:56

标签: c# android xamarin calendar xamarin.android

我有一个用Xamarin.Forms编写的应用程序,它能够创建日历事件(尽管日历代码是特定于Android的)。我已经确认该代码适用于大多数日历,但在我的两部手机上,有一个名为"我的日历"我无法添加。

我已确认密钥calendar_access_level的值对应于以下字段之一:
CalendarAccess.AccessContributor
CalendarAccess.AccessEditor
CalendarAccess.AccessOwner
CalendarAccess.AccessRoot(见CalendarAccessLevelCalendarAccessLevel values

我是否包括我不应该访问的访问级别?或者是"我的日历"我需要过滤掉哪种特殊日历?

我可以在库存日历应用中手动添加,只是不是以编程方式。我可以通过编程方式添加到任何其他日历中,因此我不相信它是该代码的问题。

更新:在有问题的物理设备上调试应用程序后,我能够找出问题所在。这是一个部分堆栈跟踪(其余部分与问题无关,它只是调用该命令的手势识别器):

Exception: java.lang.NullPointerException
id == null

at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143
at Java.Interop.JniEnvironment+StaticMethods.CallStaticObjectMethod (Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00082] in /Users/builder/data/lanes/4009/9578cdcd/source/Java.Interop/src/Java.Interop/Java.Interop/JniEnvironment.g.cs:12649
at Java.Interop.JniPeerMembers+JniStaticMethods.InvokeObjectMethod (System.String encodedMember, Java.Interop.JniArgumentValue* parameters) [0x0001b] in /Users/builder/data/lanes/4009/9578cdcd/source/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniStaticMethods.cs:97
at Java.Util.TimeZone.GetTimeZone (System.String id) [0x0001e] in /Users/builder/data/lanes/4009/9578cdcd/source/monodroid/src/Mono.Android/platforms/android-23/src/generated/Java.Util.TimeZone.cs:402
at MyProject.Droid.CalendarEventsAndroid+<CreateCalendarEventsAsync>d__4.MoveNext () [0x000bf] in C:\Projects\MyProject\MyProject.App\MyProject\Droid\DependencyServices\CalendarEventsAndroid.cs:64 

1 个答案:

答案 0 :(得分:0)

找到有问题的物理设备后,我能够在调试时重现它并解决它。问题是“我的日历”没有分配时区,我假设是因为它是默认日历并继承了用户的时区设置。因为它没有时区,所以当我传入一个空的时区标识符时Java.Util.TimeZone.GetTimeZone抛出异常。

string calTzId = GetTimeZoneIdForCalendar(calId); // Evaluates to null
Java.Util.TimeZone jCalTz = Java.Util.TimeZone.GetTimeZone(calTzId); // Exception thrown here

解决方案是检查calTzId是否为空或空,并在事件发生时使用用户的首选时区。

Java.Util.TimeZone jCalTz = !string.IsNullOrEmpty(calTzId)
    ? Java.Util.TimeZone.GetTimeZone(calTzId)
    : Java.Util.TimeZone.Default;

请参阅Xamarin的Java.Util.TimeZone.Default文档。

相关问题