Как программно отключить синхронизатор или поставщика в качестве администратора устройства?
Мне нужно написать приложение, которое может предотвратить синхронизацию контактов в рабочем профиле. До Android 9 я просто отключил пакетcom.google.android.syncadapters.contacts
и это все.
К сожалению, начиная с Android 10, Play Services отвечают за синхронизацию контактов из учетной записи Google. Но я не хочу отключать пакетcom.google.android.gms
в рабочем профиле, поскольку у него гораздо больше побочных эффектов.
Поэтому в настоящее время я ищу способ или API для отключения определенного компонента другого приложения в качестве администратора устройства или владельца рабочего профиля.
Спасибо и привет, Дэвид
1 ответ
У меня есть 3 метода, чтобы попытаться добиться этого, но я их не тестировал:
Решение 1 - setSync Автоматически:
Account[] accounts = AccountManager.get(this).getAccountsByType(theAccountType);
for (Account account : accounts) {
Log.d(TAG, "got " + account.type + " / " + account.name);
ContentResolver.setSyncAutomatically(account,ContactsContract.AUTHORITY,false); // disable auto-syncing on that sync-adapter
ContentResolver.setIsSyncable(аккаунт,ContactsContract.AUTHORITY,false); // также отключаем периодическую синхронизацию}
Решение 2 - removeAccountExplicitly:
Я думаю, что в зависимости от вашего целевого API Android может вызвать исключение, если вы пытаетесь отключить адаптер синхронизации, который не принадлежит вашему собственному приложению (т.е. подписан с использованием другого сертификата). Однако попробовать стоит.
Account[] accounts = AccountManager.get(this).getAccountsByType(theAccountType);
for (Account account : accounts) {
Log.d(TAG, "got " + account.type + " / " + account.name);
AccountManager.removeAccountExplicitly(account); // completely removing the account, not just disabling sync... beware.
}
Решение 3 - запустите экран настроек syncadapter:
Второй лучший вариант, который у вас есть, - это запустить специальный экран настроек, чтобы пользователь мог быстро отключить синхронизацию одним щелчком мыши:
final SyncAdapterType[] syncs = ContentResolver.getSyncAdapterTypes();
for (SyncAdapterType sync : syncs) {
Log.d(TAG, "found SyncAdapter: " + sync.accountType);
if (theAccountType.equals(sync.accountType)) {
Log.d(TAG, "found it: " + sync);
String activityStr = sync.getSettingsActivity();
Intent intent = new Intent(Intent.ACTION_VIEW, activityStr);
// launch the intent
}
}