gpt4 book ai didi

android - 在联系人提供商中搜索多种格式的电话号码?

转载 作者:搜寻专家 更新时间:2023-11-01 09:48:23 24 4
gpt4 key购买 nike

我一直在编写一段代码,让用户可以按姓名、电子邮件或电话号码搜索(使用 AutoCompleteTextView 逐个字符)联系人。我已经制定了以下代码:

// General contact data, so we have to get the DATA1 attribute and use MIMETYPE
// to figure out what it is. Usually we'd query, say, ContactsContract.CommonDataKinds.Email.CONTENT_URI
Uri uri = ContactsContract.Data.CONTENT_URI;
// Limit the query results to only the columns we need for faster operations.
// Using a projection also seems to make the query DISTINCT
String[] projection = new String[] {ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Data.DATA1,
ContactsContract.Data.MIMETYPE};
// Find contact records with an email address or phone number
// Search the name and data1 field (which may contain an email or phone number)
// for user-entered search phrase
String filter = "(" + ContactsContract.Data.MIMETYPE + "=? OR " + ContactsContract.Data.MIMETYPE + "=?)"
+ " AND (" + ContactsContract.Data.DATA1 + " LIKE ? OR " + ContactsContract.Data.DISPLAY_NAME + " LIKE ?)";
String wildcardedConstraint = "%" + constraintString + "%";
String[] filterParams = new String[]{ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, wildcardedConstraint, wildcardedConstraint};
// Sort contacts with the most recently contacted ones first. That's often 0 (unset)
// so do a sub-sort by last updated date, most recent contacts first
String orderBy = ContactsContract.Contacts.LAST_TIME_CONTACTED + " DESC, " + ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP + " DESC";
Cursor cursor = getContext().getContentResolver().query(uri, projection, filter, filterParams, orderBy);
if (cursor != null) {
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
String data1 = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DATA1));
String mimetype = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.MIMETYPE));
String number = null;
String email = null;
if (mimetype.equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)) {
email = data1;
} else if (mimetype.equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
number = data1;
}

items.add(new Person(name, number, email));

Log.e("temp", name + " " + data1 + " " + mimetype);
}

cursor.close();
}

但是,电话号码搜索存在问题。在通讯录中,电话号码有多种不同的格式:

  • +101234567890
  • (123) 456-7890
  • 1234567890
  • 123-456-7890

等等。

我如何调整我的联系人查询过滤器,以便用户输入可以找到任何格式的电话号码——最好不要让整个查询变得非常慢?

我发现的一些解决方案依赖于编辑表格数据来标准化电话号码,这不适用于联系人。也许那个规范化的数字字段会起作用……如果我能找到一种方法来轻松地将它构建到联系人数据表的查询中。我知道我可以对每条记录进行额外的电话号码搜索,或者使用 Java 进行检查,但我认为这会使它变得非常慢。可能是查询中的正则表达式 SQL 运算符——但我不知道如何让它适用于用户的逐字符搜索,因为他们可能只输入了电话号码的一部分。

有什么想法吗?

最佳答案

您可以使用 Android 的内置 SQLite 函数 PHONE_NUMBERS_EQUAL 执行此操作,该函数比较两个号码,如果它们足够相同,则返回 1 来电显示目的。

您只需按如下方式更改您的过滤器:

String filter = "(" + ContactsContract.Data.MIMETYPE + "=? OR "
+ ContactsContract.Data.MIMETYPE + "=?) AND "
+ "(PHONE_NUMBERS_EQUAL(" + ContactsContract.Data.DATA1 + ", ?, 0) OR "
+ ContactsContract.Data.DATA1 + " LIKE ? OR "
+ ContactsContract.Data.DISPLAY_NAME + " LIKE ?)";

然后将另一个 wildcardedConstraint 添加到您的 filterParams:

String[] filterParams = new String[] { ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE,
wildcardedConstraint,
wildcardedConstraint,
wildcardedConstraint };

PHONE_NUMBERS_EQUAL函数中最后的INTEGER参数表示是否使用严格的号码比较; 1 表示使用严格,0 表示不严格。显然,这是一个系统范围的设置,可以从系统 Resources 中检索,但我不确定是什么因素决定了如何针对特定环境确定它。上面的例子只是使用了非严格比较。但是,如果担心的话,可以像这样获取实际的资源值:

private static final String STRICT_COMPARE = "config_use_strict_phone_number_comparation";

...

int strictResId = Resources.getSystem().getIdentifier(STRICT_COMPARE, "bool", "android");
boolean useStrict = Resources.getSystem().getBoolean(strictResId);

关于android - 在联系人提供商中搜索多种格式的电话号码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36850984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com