我正在尝试制作一个语音助手应用。我正在使用wit.ai的SpeechRecognizer
和RecognitionListener
。当用户说出呼叫名称时,如果存在,我想呼叫特定联系人。为实现这一点,我使用此方法搜索联系人。
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
!我确信我做错了但不确定问题出在哪里。请帮忙
答案 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 ?";