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!
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);
}
Something that you can try is:
ContentResolver.setSyncAutomatically(account, AUTHORITY, true);
I tried setting the isAlwaysSyncable
flag but it did not work for me (although that may have been a different issue).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With