Java 如何预填充';添加联系人';Android 2.1中带有姓氏字段的活动?

Java 如何预填充';添加联系人';Android 2.1中带有姓氏字段的活动?,java,android,android-intent,android-contacts,android-activity,Java,Android,Android Intent,Android Contacts,Android Activity,我想展示“添加联系人”活动,该活动预先填充了姓氏(也称为“姓氏”和“姓氏”)。目前我只能让它填充第一个名字。这是我的密码: Intent intentAddContact = new Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI); intentAddContact.putExtra(ContactsContract.Intents.Insert.NAME, "Mickey Mouse"); intentA

我想展示“添加联系人”活动,该活动预先填充了姓氏(也称为“姓氏”和“姓氏”)。目前我只能让它填充第一个名字。这是我的密码:

Intent intentAddContact = new Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI);

intentAddContact.putExtra(ContactsContract.Intents.Insert.NAME, "Mickey Mouse");
intentAddContact.putExtra(ContactsContract.Intents.Insert.PHONE,"01234567891");
intentAddContact.putExtra(ContactsContract.Intents.Insert.EMAIL, "mickey@disney.com");

startActivityForResult(intentAddContact, ADD_CONTACT_REQUEST);

这会将“米老鼠”放在名字字段中。我需要“米奇”作为名字,而“老鼠”作为姓氏。我的应用程序需要在Android 2.1(API级别7)上运行。

不幸的是,AOSP中的“添加联系人”活动似乎只支持要提供的全名(请参阅和的源代码)

一种近似您想要的方法是直接将联系人信息插入提供商,然后启动“编辑联系人”活动,如下所示:

private void enlistMickey() throws RemoteException, OperationApplicationException {
    final ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    ContentProviderOperation.Builder builder;

    builder = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI);
    builder.withValue(RawContacts.ACCOUNT_NAME, null);
    builder.withValue(RawContacts.ACCOUNT_TYPE, null);
    ops.add(builder.build());

    builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
    builder.withValueBackReference(StructuredName.RAW_CONTACT_ID, 0);
    builder.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
    builder.withValue(StructuredName.GIVEN_NAME, "Mickey");
    builder.withValue(StructuredName.FAMILY_NAME, "Mouse");
    ops.add(builder.build());

    builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
    builder.withValueBackReference(Phone.RAW_CONTACT_ID, 0);
    builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
    builder.withValue(Phone.NUMBER, "01234567891");
    ops.add(builder.build());

    builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
    builder.withValueBackReference(Email.RAW_CONTACT_ID, 0);
    builder.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
    builder.withValue(Email.DATA, "mickey@disney.com");
    ops.add(builder.build());

    final ContentResolver cr = getContentResolver();
    final ContentProviderResult[] res = cr.applyBatch(ContactsContract.AUTHORITY, ops);
    final Uri uri = ContactsContract.RawContacts.getContactLookupUri(cr, res[0].uri);
    final Intent intent = new Intent();
    intent.setAction(Intent.ACTION_EDIT);
    intent.setData(uri);
    startActivityForResult(intent, REQUEST_CODE);
}
private void inclustMickey()抛出RemoteException、OperationApplicationException{
最终ArrayList ops=新ArrayList();
ContentProviderOperation.Builder;
builder=ContentProviderOperation.newInsert(RawContacts.CONTENT\u URI);
builder.withValue(rawscontacts.ACCOUNT\u NAME,null);
builder.withValue(RawContacts.ACCOUNT\u类型,空);
ops.add(builder.build());
builder=ContentProviderOperation.newInsert(Data.CONTENT\u URI);
builder.withValueBackReference(StructuredName.RAW\u CONTACT\u ID,0);
builder.withValue(Data.MIMETYPE、StructuredName.CONTENT\u ITEM\u TYPE);
builder.withValue(StructuredName.GIVEN_NAME,“Mickey”);
builder.withValue(StructuredName.FAMILY_NAME,“鼠标”);
ops.add(builder.build());
builder=ContentProviderOperation.newInsert(Data.CONTENT\u URI);
builder.withValueBackReference(Phone.RAW\u CONTACT\u ID,0);
builder.withValue(Data.MIMETYPE、Phone.CONTENT\u ITEM\u TYPE);
带值的建筑商(电话号码,“01234567891”);
ops.add(builder.build());
builder=ContentProviderOperation.newInsert(Data.CONTENT\u URI);
builder.withValueBackReference(Email.RAW\u CONTACT\u ID,0);
builder.withValue(Data.MIMETYPE、Email.CONTENT\u ITEM\u TYPE);
builder.withValue(Email.DATA,“mickey@disney.com");
ops.add(builder.build());
最终ContentResolver cr=getContentResolver();
最终内容提供者结果[]res=cr.applyBatch(contacts contract.AUTHORITY,ops);
最终Uri=ContactsContract.RawContacts.getContactLookupUri(cr,res[0].Uri);
最终意图=新意图();
intent.setAction(intent.ACTION\u编辑);
intent.setData(uri);
startActivityForResult(意图、请求代码);
}

与“添加”方法相比,使用此“插入并编辑”机制的一个显著区别是,如果已有联系人的数据已匹配,则提供商中的聚合过程更有可能阻止我们创建新联系人。

感谢您的回复。如果我错了,请纠正我,但是无论用户在编辑活动中做了什么,这不会将联系人插入到用户的通讯簿中吗?如果是这样,这不是一个可行的解决方案,因为我需要用户查看新联系人的信息,然后决定他们是否要添加这些信息。正如我在回答中提到的,这是一个近似值,而不是一个精确的替换:)您应该能够在onActivityResult()中检查结果代码如果用户单击“还原”按钮,则删除联系人。问题在于依赖用户还原更改。如果他们决定做些别的事情,或者他们的手机没电了怎么办?默认情况下,联系人是在没有用户许可的情况下插入的。在权限问题上,这是一个很好的观点(我认为有一些方法可以标记预插入的联系人,以便我们以后可以清理它,但这是在该点旁边)。在我看来,现在最好是您自己编写“添加联系人”活动,而不是使用系统中的活动来避免更多问题(例如,如果用户按back键,它将保存联系人,这可能并不总是他们的意图)。是的,评论不错,我想如果没有别的办法,我就得这么做。这似乎是一个遗憾,虽然这似乎是基本的功能缺失-如果你不能添加此人的姓氏,“添加联系人”活动有什么意义?