在我的应用程序中,我想调用联系人编辑器,允许用户添加新联系人。我想找到一种方法,让应用程序将一个要使用的帐户传递给编辑。如何做到这一点?
我没有找到任何关于如何做到这一点的文件。我确实在github上找到了一些代码,其中显示了一个联系人编辑器正在检索帐户信息(请参阅ContactEditorActivity(。它称
getParcelable(Intents.Insert.ACCOUNT);
不过,我认为这一定是不推荐使用的代码,因为我在引用中找不到Intents.Insert.ACCOUNT值。
总的来说,我调用编辑器的代码正在工作;这是摘录:
Intent intent = new Intent();
intent.setAction (Intent.ACTION_INSERT);
intent.setData (ContactsContract.Contacts.CONTENT_URI);
intent.putExtra (ContactsContract.Intents.Insert.NAME, name);
... "put" other values ...
startActivityForResult (intent, ACTIVITY_REQUEST_FULL_EDIT);
谢谢。
我知道这是一个老问题,但这是我的解决方案,似乎对我有效,以防有人遇到同样的问题。
我在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"EG:
Android.Accounts.Account account = new Android.Accounts.Account(accountName, accountType);
...
intent.PutExtra("com.android.contacts.extra.ACCOUNT", account);
...
这打开了联系意向,默认为传入帐户(通过传递任何电话默认值(。这很方便,因为我设置了一大堆信息,比如url、职位等,但由于联系人的意图默认为SIM卡,它会丢失,因为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;
}