我需要编写一个可以防止工作资料中的联系人同步的应用程序。 直到Android 9,我只是禁用了软件包com.google.android.syncadapters.contacts
仅此而已。
不幸的是,自Android 10以来,Play服务负责同步来自Google帐户的联系人。但我不想在工作配置文件中禁用包com.google.android.gms
,因为这会产生更多副作用。
因此,我目前正在搜索一种方法或 API,以设备管理员或工作资料所有者的身份禁用另一个应用的特定组件。
感谢和问候, 大卫
我有 3 种方法可以尝试完成此操作,但从未测试过它们:
解决方案 1 - 设置自动同步:
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(account,ContactsContract.AUTHORITY,false(; }
解决方案 2 - 显式删除帐户:
我认为,根据您的目标 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 - 启动同步适配器的设置屏幕:
您拥有的第二个最佳选择是启动特定设置屏幕,以允许用户通过单击快速禁用同步:
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
}
}