我正在编写一个应用程序以将 CalDav 和 SyncML 日历添加到日历提供程序数据库中,我可以添加它们,但我遇到了问题,因为当我重新启动时,我的日历消失了。
这是我添加日历的代码
private final CalendarEnvironmentProjection calEP = new CalendarEnvironmentProjection();
public long addCal(ContentResolver cr, String userName, String url,
String accountType, String timeZone) {
Log.v(DEBUG_TAG, "Start addCal");
ContentValues values = new ContentValues();
String accountName = userName + "@" + url.split("/")[2];
Log.v(DEBUG_TAG, "Add values");
values.put(
this.calEP.eventProj(this.calEP.PROJECTION_SYNC_ACCOUNT_INDEX),
accountName);
values.put(this.calEP
.eventProj(this.calEP.PROJECTION_SYNC_ACCOUNT_TYPE_INDEX),
accountType);
values.put(this.calEP.eventProj(this.calEP.PROJECTION_SYNC_NAME_INDEX),
userName + " Calendar's");
values.put(
this.calEP.eventProj(this.calEP.PROJECTION_DISPLAY_NAME_INDEX),
userName + " Calendar's");
values.put(this.calEP.eventProj(this.calEP.PROJECTION_SYNC_ID_INDEX),
url);
values.put(
this.calEP.eventProj(this.calEP.PROJECTION_SYNC_DIRTY_INDEX), 1);
values.put(this.calEP.eventProj(this.calEP.PROJECTION_TIMEZONE_INDEX),
timeZone);
values.put(
this.calEP.eventProj(this.calEP.PROJECTION_OWNER_ACCOUNT_INDEX),
accountName);
values.put(this.calEP
.eventProj(this.calEP.PROJECTION_CALENDAR_ACCESS_LEVEL_INDEX),
700);
values.put(
this.calEP.eventProj(this.calEP.PROJECTION_SYNC_EVENTS_INDEX),
1);
values.put(this.calEP
.eventProj(this.calEP.PROJECTION_CALENDAR_COLOR_INDEX),
Color.CYAN);
Log.v(DEBUG_TAG, "Start insert");
Uri creationUri = asSyncAdapter(
Uri.parse("content://com.android.calendar/calendars"),
accountName, accountType);
Uri uri = cr.insert(creationUri, values);
Log.v(DEBUG_TAG, "fin insert");
long calID = Long.parseLong(uri.getLastPathSegment());
Log.i(this.DEBUG_TAG, "Calendar add: " + calID);
return calID;
}
这是我充当 syncAdapter 的代码:
public CalendarDbAccessors(Context context, boolean autoInitialize) {
super(context, autoInitialize);
}
@Override
public void onPerformSync(Account account, Bundle extras, String authority,
ContentProviderClient provider, SyncResult syncResult) {
Log.i(this.DEBUG_TAG, "onPerformSync()");
}
private Uri asSyncAdapter(Uri uri, String account, String accountType) {
return uri
.buildUpon()
.appendQueryParameter("caller_is_syncadapter", "true")
.appendQueryParameter(
this.calEP
.eventProj(this.calEP.PROJECTION_SYNC_ACCOUNT_INDEX),
account)
.appendQueryParameter(
this.calEP
.eventProj(this.calEP.PROJECTION_SYNC_ACCOUNT_TYPE_INDEX),
accountType).build();
}
这是我对数据库进行的投影环境:
public class CalendarEnvironmentProjection {
private String[] eventProj = null;
private final String DEBUG_TAG = "CalendarBD";
private static final String[] EVENT_PROJECTION_8 = new String[] {
"_id", // 0
"_sync_account", // 1
"_sync_account_type", // 2
"name", // 3
"displayName", // 4
"_sync_id", // 5
"_sync_dirty", // 6
"timezone", // 7
"ownerAccount", // 8
"access_level", // 9
"sync_events", // 10
"color" // 11
};
@SuppressLint("InlinedApi")
private static final String[] EVENT_PROJECTION_14 = new String[] {
Calendars._ID, // 0
Calendars.ACCOUNT_NAME, // 1
Calendars.ACCOUNT_TYPE, // 2
Calendars.NAME, // 3
Calendars.CALENDAR_DISPLAY_NAME, // 4
Calendars._SYNC_ID, // 5
Calendars.DIRTY, // 6
Calendars.CALENDAR_TIME_ZONE, // 7
Calendars.OWNER_ACCOUNT, // 8
Calendars.CALENDAR_ACCESS_LEVEL, // 9
Calendars.SYNC_EVENTS, // 10
Calendars.CALENDAR_COLOR // 11
};
// The indices for the projections arrays above.
protected final int PROJECTION_ID_INDEX = 0;
protected final int PROJECTION_SYNC_ACCOUNT_INDEX = 1;
protected final int PROJECTION_SYNC_ACCOUNT_TYPE_INDEX = 2;
protected final int PROJECTION_SYNC_NAME_INDEX = 3;
protected final int PROJECTION_DISPLAY_NAME_INDEX = 4;
protected final int PROJECTION_SYNC_ID_INDEX = 5;
protected final int PROJECTION_SYNC_DIRTY_INDEX = 6;
protected final int PROJECTION_TIMEZONE_INDEX = 7;
protected final int PROJECTION_OWNER_ACCOUNT_INDEX = 8;
protected final int PROJECTION_CALENDAR_ACCESS_LEVEL_INDEX = 9;
protected final int PROJECTION_SYNC_EVENTS_INDEX = 10;
protected final int PROJECTION_CALENDAR_COLOR_INDEX = 11;
public CalendarEnvironmentProjection() {
if (Build.VERSION.SDK_INT >= 8 && Build.VERSION.SDK_INT < 14) {
this.eventProj = EVENT_PROJECTION_8;
} else if (Build.VERSION.SDK_INT >= 14) {
this.eventProj = EVENT_PROJECTION_14;
} else {
Log.e(this.DEBUG_TAG, "Android version not supported !");
}
}
protected String[] eventProj() {
return this.eventProj;
}
protected String eventProj(int projectionIndex) {
return this.eventProj[projectionIndex];
}}
这是我添加到我的活动中的行:
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data android:name="android.content.SyncAdapter" android:resource="@xml/calendar_sync_adapter" />
这是我在 /res/xml 中的文件:
<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="com.android.calendar"
android:accountType="com.google"
android:userVisible="true"
/>