繁体   English   中英

无法创建同步的Google日历Android

[英]Can't create a sync Google calendar Android

我正在尝试在Google帐户上创建日历,我设法创建了日历,但没有一个与Google同步,并且我不知道自己在做什么错。

我或多或少知道问题出在哪里,但我无法解决。

我使用的代码是这样的:

public static long createCalendar (Activity activity, String name, String account, boolean local){

        String color = "blue";

        ContentValues calendarvalues = new ContentValues();

        //The account that was used to sync the entry to the device. If the account_type is not {@link #ACCOUNT_TYPE_LOCAL} then the name and
        // type must match an account on the device or the calendar will be deleted.
        if(local) {
            calendarvalues.put(CalendarContract.Calendars.ACCOUNT_NAME, "DUMMYLOCAL");
            calendarvalues.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);
        }else{
            calendarvalues.put(CalendarContract.Calendars.ACCOUNT_NAME, account);
            calendarvalues.put(CalendarContract.Calendars.ACCOUNT_TYPE, account);
        }
        //Local  CalendarContract.ACCOUNT_TYPE_LOCAL

        calendarvalues.put(CalendarContract.Calendars.NAME, name);
        calendarvalues.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, name);
        calendarvalues.put(CalendarContract.Calendars.CALENDAR_COLOR, Color.parseColor(color));
        calendarvalues.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER);
//        //None          CalendarContract.Calendars.CAL_ACCESS_NONE          Cannot access the calendar
//        //freeBusy      CalendarContract.Calendars.CAL_ACCESS_FREEBUSY      Can only see free/busy information about the calendar
//        //Read          CalendarContract.Calendars.CAL_ACCESS_READ          Can read all event details
//        //Respond       CalendarContract.Calendars.CAL_ACCESS_RESPOND       Can reply yes/no/maybe to an event
//        //Override      CalendarContract.Calendars.CAL_ACCESS_OVERRIDE      not used
//        //Contributor   CalendarContract.Calendars.CAL_ACCESS_CONTRIBUTOR   Full access to modify the calendar, but not the access control settings
//        //Editor        CalendarContract.Calendars.CAL_ACCESS_EDITOR        Full access to modify the calendar, but not the access control settings
//        //Owner         CalendarContract.Calendars.CAL_ACCESS_OWNER         Full access to the calendar
//        //Root          CalendarContract.Calendars.CAL_ACCESS_ROOT          Domain admin

        calendarvalues.put(CalendarContract.Calendars.OWNER_ACCOUNT, account);
        calendarvalues.put(CalendarContract.Calendars.VISIBLE, 1);
        calendarvalues.put(CalendarContract.Calendars.SYNC_EVENTS, 1);

//        calendarvalues.put(CalendarContract.Calendars.CALENDAR_LOCATION, "Spain");


        Uri calUri = null;
        Uri result = null;

        if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {

            PermissionUtil.requestCalendarPermission(activity);

            return -1;
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            calUri = CalendarContract.Calendars.CONTENT_URI;
        }else{
            calUri = Uri.parse("content://com.android.calendar/calendars");
        }

        if(calUri != null) {
            if(local) {
                calUri = calUri.buildUpon()
                        .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
                        .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, "DUMMYLOCAL")
                        .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL)
                        .build();
            }else {
                calUri = calUri.buildUpon()
                        .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
                        .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, account)
                        .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, account)
                        .build();
            }

            result = activity.getContentResolver().insert(calUri, calendarvalues);
        }

        if (result != null) {
            try {
                return Long.parseLong(result.getLastPathSegment());
            } catch (Exception e) {
                return -1;
            }
        }
        return -1;
    }

我认为错误在于这一行:

calendarvalues.put(CalendarContract.Calendars.ACCOUNT_TYPE, account);

因为我已经看到以下查询返回的值:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
     calUri = CalendarContract.Calendars.CONTENT_URI;
}else{
     calUri = Uri.parse(calendarUriString);
}

String[] projection = new String[]{
            CalendarContract.Calendars._ID,
            CalendarContract.Calendars.NAME,
            CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,
            CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL,
            CalendarContract.Calendars.ACCOUNT_NAME,
            CalendarContract.Calendars.ACCOUNT_TYPE,
    //      CalendarContract.Calendars.CALENDAR_COLOR,
            CalendarContract.Calendars.OWNER_ACCOUNT,
            CalendarContract.Calendars.VISIBLE,
            CalendarContract.Calendars.SYNC_EVENTS,
 };

 Cursor cursor = activity.getContentResolver().query(calUri, projection, null, null, null);

结果如下:

编号:1
姓名:我的日历@本地
显示名称:我的日历
访问级别:700
帐户名:我的日历@本地
帐户类型:com.local
ownerAccount:可见所有者帐户:1
同步:1

id:2
名称:test@gmail.com
显示名称:test@gmail.com
访问级别:700
帐户名称:test@gmail.com
AccountType:com.google
ownerAccount:test@gmail.com
可见:1
同步:1

id:3
名称:Test Cal
显示名称:Test Cal
访问级别:700
帐户名称:test@gmail.com
帐户类型:test@gmail.com
owner帐户:1
可见:1
同步:1

我试着把以下内容:

calendarvalues.put(CalendarContract.Calendars.ACCOUNT_TYPE, "com.google");

但未创建日历。

如果有人知道该怎么做,或者有任何有用的示例或文档,这将是有帮助的。

提前致谢。

我在同一个问题上苦苦挣扎-我最终使用Google Calendar API 插入函数创建了日历。 使用快速入门指南,您应该能够创建日历。

像这样使用MakeRequestTask#mService

Calendar newCalendar = new Calendar();
newCalendar.setSummary("Calendar Name");
newCalendar.setTimeZone(TIME_ZONE); //assuming you have it as a constant somewhere
String newCalendarId = null;
try {
        com.google.api.services.calendar.model.Calendar insertedCalendar = mService.calendars().insert(newCalendar).execute();
        newCalendarId = insertedCalendar.getId(); 
} catch(Exception ignore){}

然后强制与

Bundle extras = new Bundle();
extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
ContentResolver.requestSync(selectedAccount, CalendarContract.AUTHORITY, extras);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM