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
- Sincronización del proveedor del calendario para Android: columnas SYNC_DATA?
- Confundido acerca de la sincronización de varias tablas con el adaptador de sincronización y el proveedor de contenido
- ¿Alguien implementó (o consiguió más información) en Android SyncObserver
- Android Studio update 0.5.3 - plataforma 'android-19' no encontrado
- Error de sincronización gradle de estudio de android
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).
- ¿Cómo puedo obtener mi APP_KEY y SECRET_KEY para la sincronización de Dropbox?
- Android Sync Sqlite
- Cómo escuchar el contacto insertado / actualizado / eliminado en la libreta de direcciones
- SyncML con Android y servicio Web de PHP
- Sincronizar base de datos Android sqlite
- Cómo hacer la sincronización bidireccional entre Android SQLite y SQL Server
- Android Studio cómo ejecutar gradle sync manualmente?
- Pausar y reanudar la sincronización de Android Repo
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 … 😉
- Cómo reproducir la aplicación no responde (ANR) de actividad y de BroadcastReceiver
- RecyclerView refresca los elementos sólo cuando se desplaza hacia abajo y hacia arriba