Sincronización personalizada que no funciona con la cuenta de Google (com.google) en algunos dispositivos Samsung

Implementé una tarea de sincronización de la misma manera que el ejemplo de BasicSyncAdapter, excepto con una cuenta de Google como en esta respuesta:

Https://stackoverflow.com/a/2972918/2072569

Funciona en la mayoría de todos los dispositivos excepto Samsung SM-P600 (Galaxy Note 2014) con Android 4.4.2 y algunas otras tabletas de Samsung.

Mi ContentProvider en el archivo de manifiesto tiene una etiqueta. Esta es la causa de este error según este post en alguna versión de Android de algunas tabletas de Samsung.

¿Samsung bloqueó la adición de tareas de sincronización a una cuenta de Google por alguna razón?

La sincronización se agrega así:

removeAllSyncTasks(); ContentResolver.setIsSyncable(mAccount, CONTENT_AUTHORITY, 1); ContentResolver.setSyncAutomatically(mAccount, CONTENT_AUTHORITY, true); ContentResolver.addPeriodicSync(mAccount, CONTENT_AUTHORITY, Bundle.EMPTY, SYNC_FREQUENCY); 

Parte manifiesta:

  <service android:name=".data.sync.SyncService" android:exported="true" android:process=":sync"> <intent-filter> <action android:name="android.content.SyncAdapter"/> </intent-filter> <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/syncadapter" /> </service> <provider android:name=".data.provider.LevensContentProvider" android:authorities="@string/authority" android:label="@string/app_name_sync" android:exported="false" android:syncable="true" /> 

Syncadapter xml:

 <?xml version="1.0" encoding="utf-8"?> <sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" android:contentAuthority="@string/authority" android:accountType="com.google" android:userVisible="true" android:supportsUploading="true" android:allowParallelSyncs="false" android:isAlwaysSyncable="true"/> 

Cuando inicio manualmente la sincronización. El Syncservice tampoco está empezando en los tablets Samsung (funciona en todos los demás dispositivos).

Resulta que no tenía nada que ver con la versión de Samsung / OS …

El constructor de mi SyncHelper fue:

  public SyncHelper(Context context, String accountName) { Account account = null; Account[] accounts = AccountManager.get(context).getAccounts(); for (Account acc : accounts) { if(acc.name.equals(accountName)){ account = acc; } } if(account == null){ throw new InvalidParameterException("Account not found"); } init(context, account); } 

Esto no comprueba el tipo de cuenta. Había una cuenta del tipo com.evernote en la lista y ésta se usó para sincronizar y eso ofcourse no trabajará.

Se agregó esto para resolverlo:

  public SyncHelper(Context context, String accountName) { Account account = null; Account[] accounts = AccountManager.get(context).getAccounts(); for (Account acc : accounts) { if(acc.name.equals(accountName) && acc.type.equals(ACCOUNT_TYPE)){ account = acc; } } if(account == null){ throw new InvalidParameterException("Account not found"); } init(context, account); } 

Ahora puedo empezar a golpear mi cabeza contra la pared … 😉

  • Lista de autorizaciones admitidas para cuentas seleccionadas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.