2012-01-16 26 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