我知道这是一个老问题,但这是我的解决方案,似乎对我有用,以防万一有人遇到同样的问题。
我在 Android 上使用 Xamarin,但 Java 代码几乎相同。
对于 API 23+,使用 ExtraAccount 字段 EG:
Android.Accounts.Account account = new Android.Accounts.Account(accountName, accountType);
...
intent.PutExtra(ContactsContract.Intents.Insert.ExtraAccount, account);
...
对于较旧的 API,我使用了“com.android.contacts.extra.ACCOUNT”字段,例如:
Android.Accounts.Account account = new Android.Accounts.Account(accountName, accountType);
...
intent.PutExtra("com.android.contacts.extra.ACCOUNT", account);
...
这打开了联系意图,默认为传入的帐户(绕过任何电话默认值)。这很方便,因为我正在设置一大堆信息,例如 url、职位等,并且由于联系意图默认为 SIM 卡而丢失了 - 它无法保存这些数据!
如果您想知道如何在手机上获取帐户,您可以使用:
AccountManager.Get(context).GetAccountsByType("com.google");
获取谷歌账户,或
AccountManager.Get(context).GetAccounts();
获取所有帐户。但是不包括电话帐户或 SIM 帐户,所以我使用此代码来获取这些:
using Android.Accounts;
...
public List<Account> GetAccounts()
{
if (CheckReadContactsPermission())
{
var accountList = new List<Account>();
var uri = ContactsContract.Settings.ContentUri;
string[] projection = { ContactsContract.Settings.InterfaceConsts.AccountName,
ContactsContract.Settings.InterfaceConsts.AccountType };
var loader = new CursorLoader(context, uri, projection, null, null, null);
var cursor = (ICursor)loader.LoadInBackground();
if (cursor.MoveToFirst())
{
do
{
accountList.Add(new Account(cursor.GetString(cursor.GetColumnIndex(projection[0])),
cursor.GetString(cursor.GetColumnIndex(projection[1]))));
} while (cursor.MoveToNext());
}
return accountList;
}
return null;
}