在android pre ICS中创建新的本地日历

时间:2012-08-20 16:17:47

标签: android calendar

我已经好几周了,所以现在我希望有人能给我一些清晰的信息。

我正在进行的项目(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"
/>

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

我稍后会与ICS合作,因为据我所知他们现在拥有公共API。

[R

3 个答案:

答案 0 :(得分:2)

hiii舵.............我在很多R&amp; D之后使用以下代码在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;
    }

试试这个......

答案 1 :(得分:0)

只需在calendar.db中添加记录即可 /data/data/com.android.providers.calendar/databases/calendar.db 如 sqlite3 calendar.db“插入日历(_id,name,displayName,access_level)值(0,'Local','MyCal',700)”

答案 2 :(得分:-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);
}