如何在 Android 2.1 中使用姓氏字段预填充“添加联系人”活动?
Posted
技术标签:
【中文标题】如何在 Android 2.1 中使用姓氏字段预填充“添加联系人”活动?【英文标题】:How can I prepopulate the 'Add Contact' activity with a last name field in Android 2.1? 【发布时间】:2011-12-31 11:18:57 【问题描述】:我想显示预先填充了姓氏(也称为“姓氏”和“姓氏”)的“添加联系人”活动。目前我只能让它填充名字。这是我的代码:
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);
这会将“Mickey Mouse”放在名字字段中。我需要“Mickey”输入名字,“Mouse”输入姓氏。我的应用需要在 android 2.1(API 级别 7)上运行。
【问题讨论】:
【参考方案1】:不幸的是,AOSP 中的股票“添加联系人”活动似乎只支持提供全名(请参阅EditContactActivity.createContact()
和EntityModifier.parseExtras()
的源代码)。
一种近似您想要的方法是将联系信息直接插入提供程序,然后启动“编辑联系人”活动,如下所示:
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);
与“添加”方法相比,使用这种“插入和编辑”机制的一个显着区别是,如果已经存在具有匹配数据的现有联系人,则提供程序中的聚合过程更有可能阻止我们创建新联系人.
【讨论】:
感谢您的回复。如果我错了,请纠正我,但是无论他们在编辑活动中做什么,这不会将联系人插入用户的地址簿吗?如果是这样,这不是一个可行的解决方案,因为我需要用户查看新联系人的信息,然后决定是否要添加他们。 正如我在答案中提到的,这是一个近似值,而不是一个精确的替换:) 如果用户单击了,您应该能够检查 onActivityResult() 中的结果代码以删除联系人“恢复”按钮。 问题在于依赖用户来还原更改。如果他们决定做其他事情或者他们的手机没电了怎么办?默认情况下,联系人是在未经用户许可的情况下插入的。 关于权限问题的好点(我认为有办法标记预先插入的联系人,以便我们以后清理它,但这不是重点)。现在在我看来,最好是编写自己的“添加联系人”活动,而不是使用系统中的活动以避免更多问题(例如,如果用户按下返回键,它将保存联系人,这可能并不总是他们的意图)。 是的,很好的评论,如果没有其他办法,这就是我必须要做的。虽然缺少这个看似基本的功能似乎很遗憾 - 如果您无法添加此人的姓氏,“添加联系人”活动的意义何在?以上是关于如何在 Android 2.1 中使用姓氏字段预填充“添加联系人”活动?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Stripe Express 入职时预填手机号码、业务类型?
我可以在 Stripe Express Onboarding 中预填手机号码字段吗?