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