自定义同步不适用于某些三星设备上的 Google 帐户 (com.google)

Custom sync not working with Google Account (com.google) on some Samsung devices

我以与 BasicSyncAdapter example 相同的方式实现了一个同步任务,除了使用 Google 帐户,就像在这个答案中:

它适用于除 Samsung SM-P600 (Galaxy Note 2014) Android 4.4.2 和其他一些三星平板电脑以外的所有设备。

我的清单文件中的 ContentProvider 有一个标签。根据 this post 在某些 Android 版本的某些三星平板电脑上,这是此错误的原因。

三星是否出于某种原因阻止向 Google 帐户添加同步任务?

同步是这样添加的:

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

清单部分:

        <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"/> 

当我手动开始同步时。 Syncservice 也不在三星平板电脑上启动(它适用于所有其他设备)。

原来跟三星没关系/OS版本...

我的 SyncHelper 的构造函数是:

 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);
    }

这不会检查帐户类型。列表中有一个 com.evernote 类型的帐户,它用于同步,当然不会工作。

添加这个来解决它:

 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);
    }

现在我可以开始用头撞墙了……;-)