关于使用Contacts API获取联系人号码有几个问题,但我想知道是否有办法确定检索到的号码是手机号码。
以下代码通常显示为获取联系人电话号码的方式,因为它获取了一个或多个电话号码的列表:
String[] projection = {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER};
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1";
Cursor cursor = null;
Cursor phones = null;
try
{
cursor = managedQuery(intent.getData(), projection, selection, null, null);
while (cursor.moveToNext())
{
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null);
while (phones.moveToNext())
{
String pdata = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
Log.v("DATA",pdata);
}
}
}
catch (NullPointerException npe)
{
Log.e(TAG, "Error trying to get Contacts.");
}
finally
{
if (phones != null)
{
phones.close();
}
if (cursor != null)
{
cursor.close();
}
}
虽然这样做没问题,但是有没有办法轻易确定电话号码是移动电话类型(除了尝试与Regex进行模式匹配)。
我怀疑必须有相关的数据,以便原生应用可以对电话号码进行分类 - 如下图所示:
答案 0 :(得分:25)
我偶然发现了一篇博客文章,该文章对使用ContactsContract api here提供了很好的解释。
因此,在上面的示例中,我将上面的部分代码更改为:
while (phones.moveToNext())
{
int phoneType = phones.getInt(phones.getColumnIndex(Phone.TYPE));
if (phoneType == Phone.TYPE_MOBILE)
{
phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
phoneNumber = phoneNumber.replaceAll("\\s", "");
break;
}
}
这会在单个联系人的所有电话周围循环,如果类型为Phone.TYPE_MOBILE则需要这个。
希望这可以帮助那些遇到同样问题的人。
答案 1 :(得分:1)
原始查询cursor = managedQuery(intent.getData(),projection,selection,null,null);应该能够为您处理过滤器。我想做同样的事情。完成后我会发布我的发现。如果有人知道如何使用第三个参数中的selection子句执行此操作。我很想知道答案。