我目前正在开发一个Android应用程序,它打算根据用户语音输入调用用户。那是当用户说出一个名字时(即" John")。我想从我的联系人列表中检索所有联系人,其中包含该姓名及其联系电话(即" John Mavel - + 94715295296,John Cena - +94715295286,Marine Jone - +94715294568,Josh John Samuwel - +94715297895。等&#34)。如果只有一个联系人,我想直接打电话而不提出任何建议。到目前为止,我已经实现了一个代码来调用给定的硬编码名称。它需要一个语音输入。
package com.chamika_kasun.voicerecognitionapp;
import java.util.ArrayList;
import java.util.List;
//import java.util.List;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
//import android.content.pm.PackageManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import android.speech.RecognizerIntent;
import android.content.pm.ResolveInfo;
public class MakeCall extends Activity implements OnClickListener {
public ListView mList;
public Button speakButton;
public static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.make_call);
speakButton = (Button) findViewById(R.id.btn_speak);
speakButton.setOnClickListener(this);
voiceinputbuttons();
// Check to see if a recognition activity is present
// if running on AVD virtual device it will give this message. The mic
// required only works on an actual android device
// Disable button if no recognition service is present
PackageManager pm = getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
if (activities.size() == 0)
{
speakButton.setEnabled(false);
speakButton.setText("Recognizer not present");
}
}
public void voiceinputbuttons() {
speakButton = (Button) findViewById(R.id.btn_speak);
mList = (ListView) findViewById(R.id.list);
}
public void startVoiceRecognitionActivity() {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"Speech recognition demo");
startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
}
public void onClick(View v) {
startVoiceRecognitionActivity();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {
// Fill the list view with the strings the recognizer thought it
// could have heard
ArrayList matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
mList.setAdapter(new ArrayAdapter(this,android.R.layout.simple_list_item_1, matches));
//if (matches.contains("vidudaya")) {
String name = matches.toString();
String number = "";
Toast.makeText(this, "Name : "+name,Toast.LENGTH_SHORT).show();
ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,"DISPLAY_NAME = '" + name + "'", null, null);
if (cursor.moveToFirst()) {
String contactId =
cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
//
// Get all phone numbers.
//
Cursor phones = cr.query(Phone.CONTENT_URI, null,
Phone.CONTACT_ID + " = " + contactId, null, null);
while (phones.moveToNext()) {
number = phones.getString(phones.getColumnIndex(Phone.NUMBER));
// int type = phones.getInt(phones.getColumnIndex(Phone.TYPE));
// switch (type) {
// case Phone.TYPE_HOME:
// // do something with the Home number here...
// break;
// case Phone.TYPE_MOBILE:
// // do something with the Mobile number here...
// break;
// case Phone.TYPE_WORK:
// // do something with the Work number here...
// break;
// }
Toast.makeText(this, "My Mobile Number : "+number,Toast.LENGTH_SHORT).show();
}
phones.close();
}
cursor.close();
String url = "tel:"+number;
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(url));
startActivity(intent);
//}
super.onActivityResult(requestCode, resultCode, data);
}
}
}
答案 0 :(得分:0)
此代码根据联系人姓名检索联系人:
Cursor contactLookupCursor =
getContentResolver().query(
Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
Uri.encode("Rohan")),
new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup.NUMBER},
null,
null,
null);
try {
while (contactLookupCursor.moveToNext()) {
contactName = contactLookupCursor.getString(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup.DISPLAY_NAME));
contactNumber = contactLookupCursor.getString(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup.NUMBER));
}
} finally {
contactLookupCursor.close();
}
希望这有帮助。
答案 1 :(得分:0)
好的,试试这个,让我知道发生了什么,
看看 ContactsContract.CommonDataKinds.StructuredName 类。您可以在那里找到您要查找的所有列。
String whereName = ContactsContract.Data.MIMETYPE + " = ?";
String[] whereNameParams = new String[] { ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE };
Cursor nameCur = contentResolver.query(ContactsContract.Data.CONTENT_URI, null, whereName, whereNameParams, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
while (nameCur.moveToNext()) {
String given = nameCur.getString(nameCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
String family = nameCur.getString(nameCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
String display = nameCur.getString(nameCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME));
}
nameCur.close();
refrence, Look at this question How to get the firstname and lastname from android contacts?
答案 2 :(得分:0)
您可以使用此代码找到联系人
String searchName = "john";
String name, number;
String columns[] = new String[] { People.NAME, People.NUMBER };
Uri mContacts = People.CONTENT_URI;
Cursor cur= getContentResolver().query(mContacts, columns, null,null, null);
if (cur.moveToFirst()) {
do {
name = cur.getString(cur.getColumnIndex(People.NAME));
number = cur.getString(cur.getColumnIndex(People.NUMBER));
if((number!=null) && (name.toLowerCase().contains(searchName.toLowerCase()))){
Toast.makeText(this, name, Toast.LENGTH_LONG).show();
// Add Contact to Search array.
}
} while (cur.moveToNext());
}