【问题标题】:What is the best practice to get events from a users google calendar?从用户谷歌日历获取事件的最佳做法是什么?
【发布时间】:2019-06-04 09:19:34
【问题描述】:

我想从用户的谷歌日历中读取事件,并将事件的标题用于将来在 Android 应用中的用途。

到目前为止,我已经阅读了有关 google-calendar-api 和 calendar-provider 等的文档,但无法运行任何“入门”指南。我也找不到任何关于如何实现 api 的有用示例。

我知道这个过程(用户需要使用他的 google 帐户验证自己的身份,并使用该信息可以访问所需的内容)但正如我所说,我不知道如何在 android 应用程序中实现这一点。

如果有人有有用的代码、示例或任何建议,我将不胜感激,因为这个简单的话题让我发疯了。

【问题讨论】:

  • 这太笼统了,你需要更精确,专注于特定的代码。另外,请记住 SO 不是免费的编码服务。您应该选择最适合您的指南代码,在问题本身中与所有相关细节分享它:错误代码(如果有),或者描述行为是如何出乎意料的。对于该过程,只有在您使用浏览器时才能使用您的谷歌帐户进行识别(如果浏览器嵌入在应用程序中,您需要在那里登录)。如果不在浏览器中,您需要使用您的凭据手动登录 API(将它们隐藏在您在此处共享的代码中)
  • @Kaddath 我知道这个问题非常广泛,但我不希望任何人给出详细的解释。也许有人遇到了同样的问题,但找到了适合他们的解决方案,或者任何人都有 github 参考。不,不需要浏览器。您当然可以在应用程序中使用您的谷歌帐户验证自己。而且您不必在代码中隐藏任何凭据,您可以使用 smartlock 来存储它们并在启动应用程序时使用他的凭据自动登录用户。这不是我面临的问题。
  • 不是太宽泛以至于根本无法回答,对本站规则来说太宽泛了,如果你想要的是教程,甚至跑题。而且因为没有什么比“不能让它工作”更具体的了,这篇文章不太可能对其他人有用。关于隐藏您的凭据,如果您在此处共享您的代码,以便其他用户看不到它们。
  • @Kaddath 我经常有堆栈溢出的经验,即使没有给定特定的上下文,人们也会在那里分享面临同样问题的经验。我经常发现提供的链接或项目作为答案非常有用。如果这里没有回答,那对我来说很好,但如果有人对我有建议,这个问题就会得到回报

标签: android kotlin google-calendar-api


【解决方案1】:

使用内容提供者可以访问日历事件,内容解析器查询()方法用于获取内容提供者数据。您需要传递需要检索的列列表。

您可以参考 android 日历文档查看以下链接 https://developer.android.com/reference/java/util/Calendar

  // add below permission in your manifest file and ask these permission at run time also
   <uses-permission android:name="android.permission.WRITE_CALENDAR"></uses-permission>
   <uses-permission android:name="android.permission.READ_CALENDAR"></uses-permission>


  public void getDataFromEventsTable() {
    Cursor cur = null;
    ContentResolver cr =getContentResolver();

    //if you want access calendar details use below uri
   // Uri uri = CalendarContract.Calendars.CONTENT_URI;
    String[] calmProjection ={CalendarContract.Calendars._ID,
                    CalendarContract.Calendars.ACCOUNT_NAME,
                    CalendarContract.Calendars.ACCOUNT_TYPE,
                    CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,
                    CalendarContract.Calendars.CALENDAR_COLOR,
                    CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL,
                    CalendarContract.Calendars.OWNER_ACCOUNT,
                    CalendarContract.Calendars.CALENDAR_TIME_ZONE,
                    CalendarContract.Calendars.ALLOWED_REMINDERS};

    //if your want access event related info use below uri
    Uri uri=CalendarContract.Events.CONTENT_URI;
    String[] eventmProjection =
            {CalendarContract.Calendars._ID,
                    CalendarContract.Events.DTSTART,
                    CalendarContract.Events.DTEND,
                    CalendarContract.Events.TITLE,
                    CalendarContract.Events.EVENT_LOCATION,
                    CalendarContract.Events.ORGANIZER,
                    CalendarContract.Events._ID,
                    CalendarContract.Events.DESCRIPTION,
                    CalendarContract.Events.DURATION,
                    CalendarContract.Events.SYNC_DATA1,
                    CalendarContract.Events.DIRTY,
                    CalendarContract.Events.UID_2445,
                    CalendarContract.Events.DELETED,
                    CalendarContract.Events.LAST_DATE,
                    CalendarContract.Events.SYNC_DATA2,
                    CalendarContract.Events.ALL_DAY,
                    CalendarContract.Events.RRULE,
                    CalendarContract.Events.STATUS,
                    CalendarContract.Events.RDATE
            };

    String selection = "((" + CalendarContract.Calendars.ACCOUNT_NAME + " = ?) AND ("
            + CalendarContract.Calendars.ACCOUNT_TYPE + " = ?) AND ("
            + CalendarContract.Calendars.OWNER_ACCOUNT + " = ?))";
  // pass here details of account, which account linked with your google calendar 
 String[] selectionArgs = new String[]{"xyz@gmail.com", "com.google",
            "xyz@gmail.com"};

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CALENDAR},12);
    }
    cur = cr.query(uri, eventmProjection, selection, selectionArgs, null);
       if(cur.getCount()>0){
        while (cur.moveToNext()) {
            String eventTitle = cur.getString(cur.getColumnIndex(CalendarContract.Events.TITLE));
            String eventId = cur.getString(cur.getColumnIndex(CalendarContract.Events._ID));
            String startDate = cur.getString(cur.getColumnIndex(CalendarContract.Events.DTSTART));
            String endDate = cur.getString(cur.getColumnIndex(CalendarContract.Events.DTEND));
            Log.d("Events", "->" + eventTitle + "->" + eventId + "->" + startDate + "->" + endDate);
        }
        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多