查了一天半,總算有點大概了。如下是本身的理解,有錯誤的地方望指正。java
android系統有日曆功能,應用程序能夠根據一些接口開發本身的功能,即便是日曆app也是根據這些接口開發的,因此咱們能夠利用程序向系統日曆寫入事件,而後用手機上的日曆軟件就能夠看到咱們添加的事件。網上這方面資料也很多,也有demo,可是我沒找到一個能夠正確運行的,有的是缺乏參數,有的是版本的緣由,4.0以上的系統這方面變更比較大,因此只能一邊查資料一邊修改。android
大致思路就是:先查看系統日曆是否有帳戶,若是沒有必需要添加一個,而後才能夠添加事件。其中有好多參數是必需要填的,還有什麼 sync adapter。事件的保存是按帳戶爲單位的。app
目前還不完善,刪除時會把系統日曆中的全部帳戶都刪除,請注意!!!框架
大致框架利用:http://blog.csdn.net/Android_Tutor/article/details/6165470 ,感謝原做者的分享。爲了體現原做者的嚮往情懷,事件內容維持不變!!ide
在此基礎上作了完善以及進行了主要的註釋。ui
用戶權限:this
01.<uses-permission android:name="android.permission.READ_CALENDAR"/> 02.<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
XML:spa
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="向系統日曆中添加事件" /> <Button android:id="@+id/inputaccount" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="添加帳戶" /> <Button android:id="@+id/readUserButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="查看帳戶" /> <Button android:id="@+id/readEventButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="查看事件" /> <Button android:id="@+id/writeEventButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="插入事件" /> <Button android:id="@+id/delEventButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="刪除事件" /> </LinearLayout>
主程序代碼:.net
package com.example.canlendertesttwo; import java.util.Calendar; import java.util.TimeZone; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.CalendarContract; import android.provider.CalendarContract.Calendars; import android.provider.CalendarContract.Events; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { //Android2.2版本之後的URL,以前的就不寫了 private static String calanderURL = "content://com.android.calendar/calendars"; private static String calanderEventURL = "content://com.android.calendar/events"; private static String calanderRemiderURL = "content://com.android.calendar/reminders"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onClick(View v) { if (v.getId() == R.id.readUserButton) { //讀取系統日曆帳戶,若是爲0的話先添加 Cursor userCursor = getContentResolver().query(Uri.parse(calanderURL), null, null, null, null); System.out.println("Count: " + userCursor.getCount()); Toast.makeText(this, "Count: " + userCursor.getCount(), Toast.LENGTH_LONG).show(); for (userCursor.moveToFirst(); !userCursor.isAfterLast(); userCursor.moveToNext()) { System.out.println("name: " + userCursor.getString(userCursor.getColumnIndex("ACCOUNT_NAME"))); String userName1 = userCursor.getString(userCursor.getColumnIndex("name")); String userName0 = userCursor.getString(userCursor.getColumnIndex("ACCOUNT_NAME")); Toast.makeText(this, "NAME: " + userName1 + " -- ACCOUNT_NAME: " + userName0, Toast.LENGTH_LONG).show(); } } else if (v.getId() == R.id.inputaccount) { //添加日曆帳戶 initCalendars(); } else if (v.getId() == R.id.delEventButton) { //刪除事件 int rownum = getContentResolver().delete(Uri.parse(calanderURL), "_id!=-1", null); //注意:會所有刪除全部帳戶,新添加的帳戶通常從id=1開始, //能夠令_id=你添加帳戶的id,以此刪除你添加的帳戶 Toast.makeText(MainActivity.this, "刪除了: " + rownum, Toast.LENGTH_LONG).show(); } else if (v.getId() == R.id.readEventButton) { //讀取事件 Cursor eventCursor = getContentResolver().query(Uri.parse(calanderEventURL), null, null, null, null); if (eventCursor.getCount() > 0) { eventCursor.moveToLast(); //注意:這裏與添加事件時的帳戶相對應,都是向最後一個帳戶添加 String eventTitle = eventCursor.getString(eventCursor.getColumnIndex("title")); Toast.makeText(MainActivity.this, eventTitle, Toast.LENGTH_LONG).show(); } } else if (v.getId() == R.id.writeEventButton) { // 獲取要出入的gmail帳戶的id String calId = ""; Cursor userCursor = getContentResolver().query(Uri.parse(calanderURL), null, null, null, null); if (userCursor.getCount() > 0) { userCursor.moveToLast(); //注意:是向最後一個帳戶添加,開發者能夠根據須要改變添加事件 的帳戶 calId = userCursor.getString(userCursor.getColumnIndex("_id")); } else { Toast.makeText(this, "沒有帳戶,請先添加帳戶", 0).show(); return; } ContentValues event = new ContentValues(); event.put("title", "與蒼井空小姐動做交流"); event.put("description", "Frankie受空姐邀請,今天晚上10點之後將在Sheraton動做交流.lol~"); // 插入帳戶 event.put("calendar_id", calId); System.out.println("calId: " + calId); event.put("eventLocation", "地球-華夏"); Calendar mCalendar = Calendar.getInstance(); mCalendar.set(Calendar.HOUR_OF_DAY, 11); mCalendar.set(Calendar.MINUTE, 45); long start = mCalendar.getTime().getTime(); mCalendar.set(Calendar.HOUR_OF_DAY, 12); long end = mCalendar.getTime().getTime(); event.put("dtstart", start); event.put("dtend", end); event.put("hasAlarm", 1); event.put(Events.EVENT_TIMEZONE, "Asia/Shanghai"); //這個是時區,必須有, //添加事件 Uri newEvent = getContentResolver().insert(Uri.parse(calanderEventURL), event); //事件提醒的設定 long id = Long.parseLong(newEvent.getLastPathSegment()); ContentValues values = new ContentValues(); values.put("event_id", id); // 提早10分鐘有提醒 values.put("minutes", 10); getContentResolver().insert(Uri.parse(calanderRemiderURL), values); Toast.makeText(MainActivity.this, "插入事件成功!!!", Toast.LENGTH_LONG).show(); } } //添加帳戶 private void initCalendars() { TimeZone timeZone = TimeZone.getDefault(); ContentValues value = new ContentValues(); value.put(Calendars.NAME, "yy"); value.put(Calendars.ACCOUNT_NAME, "mygmailaddress@gmail.com"); value.put(Calendars.ACCOUNT_TYPE, "com.android.exchange"); value.put(Calendars.CALENDAR_DISPLAY_NAME, "mytt"); value.put(Calendars.VISIBLE, 1); value.put(Calendars.CALENDAR_COLOR, -9206951); value.put(Calendars.CALENDAR_ACCESS_LEVEL, Calendars.CAL_ACCESS_OWNER); value.put(Calendars.SYNC_EVENTS, 1); value.put(Calendars.CALENDAR_TIME_ZONE, timeZone.getID()); value.put(Calendars.OWNER_ACCOUNT, "mygmailaddress@gmail.com"); value.put(Calendars.CAN_ORGANIZER_RESPOND, 0); Uri calendarUri = Calendars.CONTENT_URI; calendarUri = calendarUri.buildUpon() .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true") .appendQueryParameter(Calendars.ACCOUNT_NAME, "mygmailaddress@gmail.com") .appendQueryParameter(Calendars.ACCOUNT_TYPE, "com.android.exchange") .build(); getContentResolver().insert(calendarUri, value); } }
運行結果:
3d