Android上的日曆應用可以合併多個單獨的日曆:本地電話日曆,Google日曆等。如何將新手機日曆添加到Android?
如何將新的日曆添加到Android手機?我想動態生成該日曆中的事件,而無需訪問Google等任何在線資源。
編輯:我想支持Android 1.5和2.3.4的手機。我可能會得到一個更新到4.0的新的手機有一天,但誰知道什麼時候會...
Android上的日曆應用可以合併多個單獨的日曆:本地電話日曆,Google日曆等。如何將新手機日曆添加到Android?
如何將新的日曆添加到Android手機?我想動態生成該日曆中的事件,而無需訪問Google等任何在線資源。
編輯:我想支持Android 1.5和2.3.4的手機。我可能會得到一個更新到4.0的新的手機有一天,但誰知道什麼時候會...
我發現this link討論在4.0之前訪問手機上的日曆內容提供商。
基本上你只需要知道提供程序的URI字符串:
content://calendar
爲Android 2.2 <content://com.android.calendar
爲Android 2.2以上版本。我已經寫了以下活動(加上一些資源等)插入日曆(不同步)在API 15級仿真器上(因爲日曆應用程序沒有添加日曆的功能,不像我手機上的應用程序(API 8),或者我沒有找到它......)。該佈局必須爲日曆的名稱和顯示名稱添加文本字段,添加按鈕和狀態文本視圖以在插入後提供反饋。 請確保您有在清單中設置的權限:
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<uses-permission android:name="android.permission.READ_CALENDAR"/>
這裏是代碼:
public class CalUtilActivity extends Activity {
private EditText name;
private EditText display;
private TextView status;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);
this.name = (EditText) this.findViewById(R.id.name);
this.display = (EditText) this.findViewById(R.id.displayname);
this.status = (TextView) this.findViewById(R.id.status);
final Button b = (Button) this.findViewById(R.id.add);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
CalUtilActivity.this.addCalendar();
}
});
}
private void addCalendar() {
final String cname = this.name.getText().toString();
final String dname = this.display.getText().toString();
if(cname.length() == 0 || dname.length() == 0) {
this.status.setText(this.getResources().getString(R.string.errorNames));
return;
}
this.status.setText("");
final Uri calUri = CalendarContract.Calendars.CONTENT_URI;
final ContentValues v = new ContentValues();
v.put(CalendarContract.Calendars.NAME, cname);
v.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, dname);
v.put(CalendarContract.Calendars.VISIBLE, 1);
final Uri result = this.getContentResolver().insert(calUri, v);
this.status.setText(result.toString());
}
}
對於API 13之前,你不能使用內容提供商,你必須直接訪問數據庫。若要添加日曆,你必須添加一行到表日曆,這是根據下列創建語句
CREATE TABLE Calendars (_id INTEGER PRIMARY KEY,_sync_account TEXT,_sync_account_type TEXT,_sync_id TEXT,_sync_version TEXT,_sync_time TEXT,_sync_local_id INTEGER,_sync_dirty INTEGER,_sync_mark INTEGER,url TEXT,name TEXT,displayName TEXT,hidden INTEGER NOT NULL DEFAULT 0,color INTEGER,access_level INTEGER,selected INTEGER NOT NULL DEFAULT 1,sync_events INTEGER NOT NULL DEFAULT 0,location TEXT,timezone TEXT,ownerAccount TEXT, organizerCanRespond INTEGER NOT NULL DEFAULT 1);
設置_id,名稱定義的,如果您不需要日曆同步顯示名應該工作。但是,您無法在模擬器上進行測試,因爲日曆應用程序及其數據庫缺失。並且設備供應商可能已經在理論上修改了數據庫,但是由於有許多日曆應用程序可用,我個人認爲他們沒有修改數據庫模式。
我剛剛設法使用ICS的新API添加日曆。 Stefan的回答很有幫助,但爲了能夠寫入所有列,您必須將其作爲同步適配器進行操作。您可以使用CalendarContract.ACCOUNT_TYPE_LOCAL從普通應用程序執行此操作。以下代碼應該適用於ICS。也許某些列值不正確。查看CalendarContract.Calendars的文檔。不幸的是,我無法幫助您使用較舊的Android版本,但CalendarContract僅用於某些常量字符串值。也許這些也適用於舊版本。
Uri calUri = CalendarContract.Calendars.CONTENT_URI;
ContentValues cv = new ContentValues();
cv.put(CalendarContract.Calendars.ACCOUNT_NAME, yourAccountName);
cv.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);
cv.put(CalendarContract.Calendars.NAME, yourInternalName);
cv.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, yourDisplayName);
cv.put(CalendarContract.Calendars.CALENDAR_COLOR, yourColor);
cv.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER);
cv.put(CalendarContract.Calendars.OWNER_ACCOUNT, true);
cv.put(CalendarContract.Calendars.VISIBLE, 1);
cv.put(CalendarContract.Calendars.SYNC_EVENTS, 1);
calUri = calUri.buildUpon()
.appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
.appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, ACCOUNT_NAME)
.appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL)
.build();
Uri result = this.getContentResolver().insert(calUri, cv);
+1它幫助我很多,非常感謝。 – Andrain 2014-02-04 06:44:19
ICS上:你需要實現對com.android.calendar權威同步適配器和創建CalendarContract行.Calendar將ACCOUNT_NAME和ACCOUNT_TYPE設置爲您的姓名和值。 2的功能。3和更早的版本是未發表的,但它們的工作原理是相同的 - 但是要進一步向後兼容互操作性,這樣做會比較麻煩和耗時。 – Jens 2012-01-16 15:15:34