Поиск контактов в приложении android
Я следил за этими ссылками, чтобы получить контакты в моем приложении
Как позвонить в список контактов Android?
http://www.higherpass.com/Android/Tutorials/Working-With-Android-Contacts/
Я могу отобразить список контактов на телефоне, но
-
-
Я хочу добавить флажок на каждом контакте, чтобы пользователь мог выбрать
несколько контактов и нажав кнопку "Готово", он должен уметь
получить все контакты, которые он выбрал
-
Также я хочу получить имя контакта, а также телефон номер контакта, см. мой код:
if (resultCode == Activity.RESULT_OK) {
Uri contactData = data.getData();
Cursor c = managedQuery(contactData, null, null, null, null);
if (c.moveToFirst()) {
String name = c.getString(c
.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
String number = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER));
Log.v("name", name +" "+number);
// TODO Whatever you want to do with the selected contact
// name.
}
}
на log cat он показывает вывод как:
01-09 12:46:41.688: V/name(699): Xyz 1
то есть имя контакта - xyz, и у него есть по крайней мере один номер телефона, связанный с ним. Пожалуйста, помогите мне в том, как я могу получить номер, связанный с этим контактом.
EDIT:
если я использую эту строку (String number = c.getString(c.getColumnIndexOrThrow(People.NUMBER));
) в коде, я получаю следующее исключение:
01-09 13:33:23.008: E/AndroidRuntime(786): FATAL EXCEPTION: main
01-09 13:33:23.008: E/AndroidRuntime(786): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.contacts/contacts/lookup/0r1-2C2E30/1 (has extras) }} to activity {sra.com/sra.com.ContactsDemo}: java.lang.IllegalArgumentException: column 'number' does not exist
01-09 13:33:23.008: E/AndroidRuntime(786): at android.app.ActivityThread.deliverResults(ActivityThread.java:3515)
01-09 13:33:23.008: E/AndroidRuntime(786): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557)
01-09 13:33:23.008: E/AndroidRuntime(786): at android.app.ActivityThread.access$2800(ActivityThread.java:125)
01-09 13:33:23.008: E/AndroidRuntime(786): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063)
01-09 13:33:23.008: E/AndroidRuntime(786): at android.os.Handler.dispatchMessage(Handler.java:99)
01-09 13:33:23.008: E/AndroidRuntime(786): at android.os.Looper.loop(Looper.java:123)
01-09 13:33:23.008: E/AndroidRuntime(786): at android.app.ActivityThread.main(ActivityThread.java:4627)
01-09 13:33:23.008: E/AndroidRuntime(786): at java.lang.reflect.Method.invokeNative(Native Method)
01-09 13:33:23.008: E/AndroidRuntime(786): at java.lang.reflect.Method.invoke(Method.java:521)
01-09 13:33:23.008: E/AndroidRuntime(786): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-09 13:33:23.008: E/AndroidRuntime(786): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-09 13:33:23.008: E/AndroidRuntime(786): at dalvik.system.NativeStart.main(Native Method)
01-09 13:33:23.008: E/AndroidRuntime(786): Caused by: java.lang.IllegalArgumentException: column 'number' does not exist
01-09 13:33:23.008: E/AndroidRuntime(786): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
01-09 13:33:23.008: E/AndroidRuntime(786): at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:99)
01-09 13:33:23.008: E/AndroidRuntime(786): at sra.com.ContactsDemo.onActivityResult(ContactsDemo.java:49)
01-09 13:33:23.008: E/AndroidRuntime(786): at android.app.Activity.dispatchActivityResult(Activity.java:3890)
01-09 13:33:23.008: E/AndroidRuntime(786): at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
01-09 13:33:23.008: E/AndroidRuntime(786): ... 11 more
Ответы
Ответ 1
Увидев ответы, я думаю, вы получили ответ о том, как получить контакты, и теперь вы хотите получить выбранные контакты в своей деятельности.
Чтобы получить контактный номер, специфичный для имени контакта:
ContentResolver contactResolver = getContentResolver();
Cursor cursor = contactResolver.query(Phone.CONTENT_URI, null, Phone.DISPLAY_NAME + "=?", new String[]{contactName}, null);
if(cursor.getCount() > 0){
cursor.moveToFirst();
do {
String number = cursor.getString(mCursor.getColumnIndex(Phone.NUMBER));
}while (cursor.moveToNext() );
}
Примечание. Здесь contactName
- имя контакта, которое вы хотите использовать для контактов.
Я предполагаю, что вы указали контакты с флажком в ListView, и вот ваше решение, чтобы получить список контактов, выбранный пользователь к вашей деятельности:
1. Запустите свою контактную деятельность с помощью startActivityForResult()
.
2. Инициализировать переменную ArrayList
в контактной активности, скажем, contactArrayList
.
3.. Когда пользователь checks the checkbox
, добавьте этот контакт в свой contactArrayList
и продолжайте добавлять, а затем unchecks
удалите контакт из contactArrayList
.
4.. Когда пользователь нажимает, установите результат ok с выбранным списком контактов, который вы добавили в contactArrayList
, следующим образом:
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putStringArrayList("contacts", contactArrayList);
intent.putExtras(bundle);
setResult(RESULT_OK, intent);
и finish()
эту активность.
5. При переопределении вызывающей активности:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK && data != null ){
Bundle bundle = new Bundle();
bundle = data.getExtras();
ArrayList list = bundle.getStringArrayList("contacts");
}
}
Примечание. Вышеупомянутый код был протестирован в версии 2.3.3.
Ответ 2
Пожалуйста, попробуйте этот код
Cursor c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
String name, number = "";
String id;
c.moveToFirst();
for (int i = 0; i < c.getCount(); i++) {
name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
id = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
if (Integer.parseInt(c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
Cursor pCur = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id },
null);
while (pCur.moveToNext()) {
number = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
}
Log.i("name ", name + " ");
Log.i("number ", number + " ");
c.moveToNext();
Ответ 3
Здесь у вас есть курсор c
Cursor c = getContentResolver().query(Phones.CONTENT_URI, null, null,null, null);
чтобы получить имя
String name = c.getString(c.getColumnIndex(People.NAME));
чтобы получить номер
String number = c.getString(c.getColumnIndex(People.NUMBER));
Вы можете перебирать курсор и сохранять их в списке. Создайте представление списка флажков и привяжите его к этому списку.
Ответ 4
Просто укажите объект контактных данных, и всякий раз, когда вы выбираете какой-либо элемент в списке, задайте значение этого контакта в этом поле.
в
AdapterView.onItemClickListener()
{
public void onItemClick(AdapterView list, View view, int position, long id)
{
Contact contact=listContacts.get(position);
selectedContact=contact;//If Done Button on List
//if activity is to be finished on selection
{
Intent intent=new Intent();
intent.putExtra(KEY_NAME, contact.Name);
....
setResult(RESULT_OK, intent);
finish();
}
}
}
Ответ 5
Попробуйте выполнить код ниже:
ContentResolver contactResolver = getContentResolver();
Cursor cursor = contactResolver.query(Phone.CONTENT_URI, null, Phone.DISPLAY_NAME + "=?", new String[]{contactName}, null);
if(cursor.getCount() > 0){
cursor.moveToFirst();
do {
String number = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));
}while (cursor.moveToNext() );
}