按姓名搜索联系人出错

时间:2017-11-07 11:36:43

标签: java android contacts

我正在尝试制作一个语音助手应用。我正在使用wit.ai的SpeechRecognizerRecognitionListener。当用户说出呼叫名称时,如果存在,我想呼叫特定联系人。为实现这一点,我使用此方法搜索联系人。

public  String getPhoneNumber(Context context,String query) {
    String  name=null;

    Cursor cur;
    ContentResolver cr = context.getContentResolver();

    String[] mProjection = {ContactsContract.Contacts._ID,
            ContactsContract.Contacts.LOOKUP_KEY,
            ContactsContract.Contacts.HAS_PHONE_NUMBER,
            ContactsContract.Contacts.DISPLAY_NAME};

    Uri uri = ContactsContract.Contacts.CONTENT_URI;

    String selection = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " LIKE ?";
    String[] selectionArgs = new String[]{"%"+query+"%"};

    cur = cr.query(uri, mProjection, selection, selectionArgs, null);
    while (cur != null && cur.moveToNext()) {

       name = cur.getString(
                cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
    }
    if (cur != null) {
        cur.close();
    }



    return name;
}

该方法始终返回null!我确信我做错了但不确定问题出在哪里。请帮忙

2 个答案:

答案 0 :(得分:2)

当您向Content Resolver查询请求时,您只需要 Uri 投影用于Cursor,并将所有参数设置为null,看看:

Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] projection    = new String[] 
{
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER};

Cursor people = getContentResolver().query(uri, projection, null, null, null);

int indexName = 
people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
int indexNumber = 
people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);

if(people.moveToFirst()) {
do {
    String name   = people.getString(indexName);
    String number = people.getString(indexNumber);
    // Do work...
} while (people.moveToNext());
}

快乐编码!!

答案 1 :(得分:1)

首先,检查你是checking permissions at runtime for android> = 6.0,并且权限不仅在清单中。

此外,您的方法称为 getPhoneNumber ,但是返回联系人的姓名,一定是错误的。 如果你想要电话号码,你应该在一段时间内更改代码,而如果你传递一个电话号码来获取联系人的姓名,选择字符串应该改为检查HAS_PHONE_NUMBER。

您可以做的另一件事是更改选择字符串以检查DISPLAY_NAME:

String selection = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " LIKE ?"
    + " OR " + ContactsContract.Contacts.DISPLAY_NAME + " LIKE ?";