4

Google カレンダーのイベントには、名前と値のペアをイベントに添付するために使用できる拡張プロパティがあります。

これらの拡張プロパティを使用して追加情報をイベントに添付する共同カレンダー アプリケーションを実装しています。Google が推奨するように、Android CalendarProvider を使用して新しいイベントを読み取り、作成します。新しいイベントを作成するとき、いくつかの拡張プロパティを追加する必要がありますが、カレンダー プロバイダーが書き込みCalendarContract.ExtendedPropertiesを許可していないことに気付きました。試してみると、次のエラーが発生します。

Only sync adapters may write using content://com.android.calendar/extendedproperties

これらのプロパティが CalendarProvider で読み取り専用であることは少し奇妙に思えます。これは、追加のメタデータをイベントに添付できるというそれらの目的全体を無効にするためです。

この制限の回避策を知っている人はいますか?

4

1 に答える 1

3

以下のように進める必要があります。

  • 拡張プロパティを使用してイベントを保存するために使用するクラスは、 AbstractThreadedSyncAdapterを拡張し、メソッド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パスで、コンテンツを含む xml ファイルsyncadpater.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"
    />

Extendedproperties をイベントに追加するために使用されるコードは、次のようになります。

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" />

次に、作成した Service を 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>

幸運を!

于 2015-04-20T14:15:29.177 に答える