1

我已经为此奋斗了好几个星期,所以现在我希望这里有人能给我一些澄清。

我正在从事的项目(ICS 之前)包括登录我公司的服务器,获取我未来的工作计划并将其存储在我的手机上的单独日历中。这个日历应该可以在所有主要的日历应用程序(Jorte、Business Calendar、Smooth Calendar ++)中查看。我将日程表解析并存储在手机上的 SQLite 数据库中。但我的努力是从那里开始创建一个单独的本地日历并将所有事件存储在那里。我以为我必须为此创建一个帐户(不要弄乱电话上的任何其他帐户。这与代码配合得很好:

AccountManager man = (AccountManager) getSystemService(ACCOUNT_SERVICE);
Account acc = new Account("myCalendar", "com.lumabyte.mycalendar");

但我认为在该帐户上创建日历会很容易:

ContentValues calendar = new ContentValues();
calendar.put("_sync_account", "myCalendar"); // My account
calendar.put("_sync_account_type","com.lumabyte.mycalendar"); 
calendar.put("name", "myCalendar");
calendar.put("displayName", "myCalendar");
calendar.put("hidden",0);
calendar.put("color",0xFF008080);
calendar.put("access_level", 700);
calendar.put("sync_events", 1);
calendar.put("timezone", "Europe/Paris");
calendar.put("ownerAccount", sync_account);
Uri calendarUri = Uri.parse(getCalendarUriBase() + "calendars");
this.getContentResolver().insert(calendarUri, calendar);

函数 getCalendarUriBase():

private String getCalendarUriBase() {

    String calendarUriBase = null;
    Uri calendars = Uri.parse("content://calendar/calendars");
    Cursor managedCursor = null;
    try {
        managedCursor = this.managedQuery(calendars, null, null, null, null);
    } catch (Exception e) {
        // eat
    }

    if (managedCursor != null) {
        calendarUriBase = "content://calendar/";
    } else {
        calendars = Uri.parse("content://com.android.calendar/calendars");
        try {
            managedCursor = this.managedQuery(calendars, null, null, null, null);
        } catch (Exception e) {
            // eat
        }

        if (managedCursor != null) {
            calendarUriBase = "content://com.android.calendar/";
        }

    }

    managedCursor.close();

    return calendarUriBase;
}

清单包括:

  <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
  <uses-permission android:name="android.permission.USE_CREDENTIALS" /> 
  <uses-permission android:name="android.permission.MAMAGE_ACCOUNTS"/>
  <uses-permission android:name="android.permission.GET_ACCOUNTS" />    
  <uses-permission android:name="android.permission.READ_CALENDAR">
  <uses-permission android:name="android.permission.WRITE_CALENDAR">    

我的authenticator.xml是这样的:

<?xml version="1.0" encoding="utf-8"?>
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"  
    android:accountType="com.lumabyte.mycalendar"
    android:icon="@drawable/icon"
    android:smallIcon="@drawable/icon"
    android:label="@string/authenticator_label"
/>

我没有收到任何错误消息,但只创建了帐户,而不是日历。代码中是否存在小错误,或者我误解了整个概念。我知道在 ICS 之前没有 API,并且存在风险。但无论如何我都需要完成它。最好在尽可能多的手机上保持稳定。任何帮助或示例将不胜感激。

稍后我将与 ICS 合作,因为我知道他们现在有我的公共 API。

r

4

3 回答 3

2

hiii rudder............. 经过大量研发后,我在 2.3.6 中使用以下代码添加了一个日历......

ContentValues calendar=new ContentValues();
Uri calendarUri =Uri.parse(getBaseCalUri() + "/calendars");

calendar.put("_sync_account", "Test1");
calendar.put("_sync_account_type", "LOCAL");

    calendar.put("name", "CalenTest");
    calendar.put("displayName", "calDispName");
    calendar.put("color", 0xFF008080);
    calendar.put("access_level", 700);
    calendar.put("ownerAccount", true);
    calendar.put("sync_events", 1);

    calendarUri = calendarUri.buildUpon()
        .appendQueryParameter("_sync_account", "Test1")
        .appendQueryParameter("_sync_account_type", "LOCAL")  
        .build();
    Uri result = getContentResolver().insert(calendarUri, calendar);

我的 getBaseCalUri() 是

private Uri getBaseCalUri(){
        Class<?> calendarProviderClass;
        Field uriField;
        Uri calendarUri=null;
        try {
            calendarProviderClass = Class.forName("android.provider.Calendar");
            uriField = calendarProviderClass.getField("CONTENT_URI");
            calendarUri = (Uri) uriField.get(null);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return calendarUri;
    }

尝试这个....

于 2012-11-08T07:13:59.893 回答
0

只需在 calendar.db /data/data/com.android.providers.calendar/databases/calendar.db 中添加一条记录作为 sqlite3 calendar.db "插入日历 (_id,name,displayName,access_level) 值 (0,'本地','MyCal',700)"

于 2013-03-24T05:03:26.817 回答
-2

这是我尝试过的好方法,希望对您有所帮助:

/** * 添加日历事件。*/

private void addCalendarEvent(){
                    Context context = getContext();
                    Intent intent = new Intent(Intent.ACTION_EDIT);
            intent.setType("vnd.android.cursor.item/event");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra("beginTime", stTime);
            intent.putExtra("allDay", true);
            intent.putExtra("description", description);
            intent.putExtra("eventLocation", place);
            intent.putExtra("rrule", "FREQ=YEARLY");
            intent.putExtra("endTime", enTime);
            intent.putExtra("title", category);
                    context.startActivity(intent);
}
于 2012-11-07T10:11:14.430 回答