Защо CalendarProvider не позволява писане на ExtendedProperties?

Събитията в календара на Google имат разширени свойства, които могат да се използват за прикачване на двойки име/стойност към събитие.

Внедряваме приложение за съвместен календар, което използва тези разширени свойства, за да прикачи допълнителна информация към събитието. Както препоръчва Google, ние използваме Android CalendarProvider за четене и създаване на нови събития. Когато създаваме ново събитие, трябва да добавим някои разширени свойства към него, но току-що разбрахме, че доставчикът на календара не позволява писане CalendarContract.ExtendedProperties, ако опитаме, получаваме следната грешка:

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

Изглежда малко странно, че тези свойства са само за четене в CalendarProvider, защото това проваля цялата им цел, а именно да могат да прикачат някои допълнителни метаданни към събитието.

Някой знае ли заобиколно решение за това ограничение?


person ivacf    schedule 04.12.2014    source източник


Отговори (1)


трябва да продължите както следва:

  • класът, който използвате за запазване на събития с разширени свойства, трябва да разширява 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" />

След това декларирайте услугата, която сте създали, във файла на манифеста, свързан с файла 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>

Късмет!

person Omzo25    schedule 20.04.2015