2012-01-16 79 views
10

Android上的日曆應用可以合併多個單獨的日曆:本地電話日曆,Google日曆等。如何將新手機日曆添加到Android?

如何將新的日曆添加到Android手機?我想動態生成該日曆中的事件,而無需訪問Google等任何在線資源。

編輯:我想支持Android 1.5和2.3.4的手機。我可能會得到一個更新到4.0的新的手機有一天,但誰知道什麼時候會...

+0

ICS上:你需要實現對com.android.calendar權威同步適配器和創建CalendarContract行.Calendar將ACCOUNT_NAME和ACCOUNT_TYPE設置爲您的姓名和值。 2的功能。3和更早的版本是未發表的,但它們的工作原理是相同的 - 但是要進一步向後兼容互操作性,這樣做會比較麻煩和耗時。 – Jens 2012-01-16 15:15:34

回答

3

我發現this link討論在4.0之前訪問手機上的日曆內容提供商。

基本上你只需要知道提供程序的URI字符串:

  • content://calendar爲Android 2.2 <
  • content://com.android.calendar爲Android 2.2以上版本。
3

我已經寫了以下活動(加上一些資源等)插入日曆(不同步)在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,名稱定義的,如果您不需要日曆同步顯示名應該工作。但是,您無法在模擬器上進行測試,因爲日曆應用程序及其數據庫缺失。並且設備供應商可能已經在理論上修改了數據庫,但是由於有許多日曆應用程序可用,我個人認爲他們沒有修改數據庫模式。

13

我剛剛設法使用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); 
+0

+1它幫助我很多,非常感謝。 – Andrain 2014-02-04 06:44:19

-5

最簡單的是在谷歌日曆中創建您的計算機並實現同步

+8

你讓我發笑:) ...至少,我希望它是作爲一個笑話。 – Glenn85 2013-06-20 09:37:49