Can't perform Sync (onPerformSync is not called)
android, android-service
Solution
Sometimes this method won't be called due to similar sync in progress. You can check it and cancel with following code:
if (ContentResolver.isSyncPending(yourAccount, yourAuthority) ||
ContentResolver.isSyncActive(yourAccount, yourAuthority)) {
Log.i("ContentResolver", "SyncPending, canceling");
ContentResolver.cancelSync(yourAccount, yourAuthority);
}
Problem
I follow this title Why does ContentResolver.requestSync not trigger a sync? but Sync method does not appear in Account&Sync in Setting screen. I think that onPerformSync() is not called. I try to debug but no error log found. Here are my code : syncAdapter.xml ``` <sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="@string/ACCOUNT_TYPE" android:contentAuthority="@string/AUTHORITY" android:userVisible="true" android:isAlwaysSyncable="true" ``` /> SyncService.java ``` public class CalendarSyncService extends Service{ private static SyncAdapterImpl sSyncAdapter = null; private static String list_event_ids; private static Requestor requestor; public void onCreate(){ super.onCreate (); if (sSyncAdapter == null) sSyncAdapter = new SyncAdapterImpl(this); } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return sSyncAdapter.getSyncAdapterBinder(); } public class SyncAdapterImpl extends AbstractThreadedSyncAdapter { Context context; public SyncAdapterImpl(Context context) { super(context, true); // TODO Auto-generated constructor stub this.context = context; } @Override public void onPerformSync(Account arg0, Bundle arg1, String arg2, ContentProviderClient arg3, SyncResult arg4) { // TODO Auto-generated method stub Log.e("thuutai", "Perform Sync Call"); try { CalendarSyncService.performSync(context); } catch (DOMException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ``` I call it in here ``` public void onClick(View arg0) { Bundle params = new Bundle(); params.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false); params.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false); params.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false); ContentResolver.addPeriodicSync(selectedAccount, getString(R.string.AUTHORITY), params, 3600); ContentResolver.setSyncAutomatically(selectedAccount, getString(R.string.AUTHORITY), true); ContentResolver.requestSync(selectedAccount, getString(R.string.AUTHORITY), params);} ``` Manifest.xml ``` <service android:name=".service.CalendarSyncService" android:exported="true"> <intent-filter> <action android:name="android.content.SyncAdapter" /> </intent-filter> <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/syncadapter" /> </service> ``` I tested in Nexus S Android 4.0. Thank for your reading!