为什么CalendarProvider不允许编写ExtendedProperties?

4

谷歌日历事件有扩展属性,可用于向事件附加名称/值对。我们正在实现一款协作日历应用程序,该应用程序使用这些扩展属性将额外信息附加到事件上。按照谷歌的建议,我们使用Android CalendarProvider来读取和创建新事件。当我们创建一个新事件时,需要向其添加一些扩展属性,但是我们刚刚意识到日历提供程序不允许编写CalendarContract.ExtendedProperties,如果我们尝试,就会出现以下错误:

只有同步适配器可以使用content://com.android.calendar/extendedproperties进行编写

在CalendarProvider中,这些属性是只读的,似乎有点奇怪,因为它挫败了它们的整个目的,即能够将一些额外的元数据附加到事件上。

有人知道如何解决此限制吗?

1个回答

3
您需要按照以下步骤进行操作:
  • the class you use for saving events with extended propeties should extends AbstractThreadedSyncAdapter , then implements the method onPerfomSync(...)

    public void onPerformSync(Account account, Bundle extras, String authority,
        ContentProviderClient provider, SyncResult syncResult) {
    System.out.println("Sync......");
    saveEvent();//your saving events method... 
    

    }

在同一个类中添加以下方法:
    static Uri asSyncAdapter(Uri uri, String account, String accountType) {
    return uri.buildUpon()
        .appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true")
        .appendQueryParameter(Calendars.ACCOUNT_NAME, account)
        .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build();
 }

创建一个继承 Service 类的类,如下所示。
public class SyncService extends Service {
private static final String TAG = "SyncService";

private static final Object sSyncAdapterLock = new Object();
private static EditEventHelper sSyncAdapter = null;

/**
 * Thread-safe constructor, creates static {@link SyncAdapter} instance.
 */
@Override
public void onCreate() {
    super.onCreate();
    Log.i(TAG, "Service created");
    synchronized (sSyncAdapterLock) {
        if (sSyncAdapter == null) {
            sSyncAdapter = new EditEventHelper(getApplicationContext());

        }
    }
}

@Override
/**
 * Logging-only destructor.
 */
public void onDestroy() {
    super.onDestroy();
    Log.i(TAG, "Service destroyed");
}

/**
 * Return Binder handle for IPC communication with {@link SyncAdapter}.
 *
 * <p>New sync requests will be sent directly to the SyncAdapter using this channel.
 *
 * @param intent Calling intent
 * @return Binder handle for {@link SyncAdapter}
 */
@Override
public IBinder onBind(Intent intent) {
    return sSyncAdapter.getSyncAdapterBinder();
}

res 路径下创建一个名为 syncadpater.xml 的 xml 文件,其内容如下:

<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
          android:contentAuthority="com.android.calendar"
          android:accountType="com.android.google"
          android:userVisible="true"
          android:supportsUploading="false"
          android:allowParallelSyncs="false"
          android:isAlwaysSyncable="false"
    />

用于向您的事件添加扩展属性的代码将是:
ContentValues customerContentValues_1 = new ContentValues(); 
        customerContentValues_1.put(ExtendedProperties.EVENT_ID, model.mId);
        customerContentValues_1.put(ExtendedProperties.NAME, "name");
        customerContentValues_1.put(ExtendedProperties.VALUE, value);
activity.getContentResolver().insert(asSyncAdapter(ExtendedProperties.CONTENT_URI, mOwnerAccount, ACCOUNT_TYPE), customerContentValues_1);

AndroidManifest.xml 文件中添加以下权限:
    <uses-permission android:name="android.permission.READ_SYNC_STATS" />
<!-- Required to enable our SyncAdapter after it's created. -->
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<!-- Required because we're manually creating a new account. -->
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />

然后在与syncadapter.xml文件相关联的清单文件中声明您创建的服务:
        <service
        android:name="com.android.calendar.iselection.event.SyncService"
        android:exported="true" >

        <!--
        This intent filter is required. It allows the system to launch our sync service
        as needed.
        -->
        <intent-filter>
            <action android:name="android.content.SyncAdapter" />
        </intent-filter>
        <!-- This points to a required XML file which describes our SyncAdapter. -->
        <meta-data
            android:name="android.content.SyncAdapter"
            android:resource="@xml/syncadapter" />
    </service>

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接