Так как это единственный вопрос, который я видел, связанный с этой проблемой, вот ответ с> поздним опозданием.Я также столкнулся с проблемой постоянной блокировки из-за того, что система Android автоматически синхронизировала мою учетную запись.
Лучший способ справиться с этим, который требует минимального кода и фактически делает его таким, чтобы учетная запись никогда не синхронизировалась, если не был специально вызван для синхронизации в коде:
ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 0);
Теперь для этого требуется моментсоздать свою учетную запись вы называете этот статический метод.Принимая во внимание, что первый параметр - это учетная запись, для которой устанавливается этот параметр, второй параметр - это полномочия используемого контент-провайдера, а третий - целое число, которое при задании положительного числа включает синхронизацию, когда при значении 0 отключается синхронизация, а при задании чего-либо ещеделает это неизвестным.Полномочия для использования могут быть найдены внутри вашего "sync_something.xml" в атрибуте contentAuthority, который используется вашим SyncAdapter:
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="com.android.contacts"
android:accountType="com.myapp.account"/> <!-- This being your own account type-->
Указанный выше файл xml указан внутри служебной части вашего AndroidManifest.xml:
<service android:name=".DummySyncAdapterService"
exported="true"
android:process=":contacts">
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data android:name="android.content.SyncAdapter"
android:resource="@xml/sync_something" /> <!--This points to your SyncAdapter XML-->
</service>
Это фрагмент кода, который я использую для создания своей учетной записи внутри моей учетной записи LoginActivity:
Account account = new Account("John Doe", "com.myapp.account");
ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 0);
AccountManager am = AccountManager.get(LoginActivity.this);
boolean accountCreated = am.addAccountExplicitly(account, "Password", null);
Bundle extras = LoginActivity.this.getIntent().getExtras();
if(extras != null){
if (accountCreated) {
AccountAuthenticatorResponse response = extras.getParcelable(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
Bundle result = new Bundle();
result.putString(AccountManager.KEY_ACCOUNT_NAME, "John Doe");
result.putString(AccountManager.KEY_ACCOUNT_TYPE, "com.myapp.account");
response.onResult(result);
}
}
Большая часть этого заключается в том, что когда система пытается синхронизировать службу, он проверяет, является ли служба синхронизируемой в первую очередь, если она установлена в false, она отменяет синхронизацию.Теперь вам не нужно создавать свой собственный ContentProvider
, а ваш ContentProvider
не отображается в разделе «Данные и синхронизация». Однако вам нужно иметь реализацию-заглушку AbstractThreadedSyncAdapter, которая возвращает IBinder внутри его метода onBind. И, наконец, что не менее важно, он делает так, чтобы пользователь не мог включить синхронизацию или использовать «Синхронизировать сейчас»кнопка для этой учетной записи, если вы не добавили функциональность в свое приложение.