如何使用联系人 ID 获取特定的联系电话
Posted
技术标签:
【中文标题】如何使用联系人 ID 获取特定的联系电话【英文标题】:How to get Specific Contact Number by using Contact Id 【发布时间】:2012-03-27 12:46:38 【问题描述】:这里我的联系人姓名显示在列表视图中。通过单击列表,我得到ContactName
和Contact Id
。从那我想通过使用Contact ID
或Contact name
来获取Phone number
,请帮助我。
这是我的代码
void ReadContacts(String sort)
final Uri uri = ContactsContract.Contacts.CONTENT_URI;
final String[] projection = new String[]
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME
;
//boolean mShowInvisible = false;
String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'";
String[] selectionArgs = null;
final String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
m_curContacts = managedQuery(uri, projection, selection, selectionArgs, sortOrder);
String[] fields = new String[] ContactsContract.Data.DISPLAY_NAME;
m_slvAdapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1,
m_curContacts,
fields,
new int[] android.R.id.text1);
m_slvAdapter.setFilterQueryProvider(new FilterQueryProvider()
public Cursor runQuery(CharSequence constraint)
Log.d(LOG_TAG, "runQuery constraint:"+constraint);
String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'" +
" AND "+ ContactsContract.Contacts.DISPLAY_NAME + " LIKE '%"+constraint+"%'";
String[] selectionArgs = null;//new String[]"'1'";//, ;
Cursor cur = managedQuery(uri, projection, selection, selectionArgs, sortOrder);
return cur;
);
m_lvContacts.setAdapter(m_slvAdapter);
// cur.close();
public void onItemClick(AdapterView<?> arg0, View v, int position, long id)
ContentResolver cr;
Cursor cursor = (Cursor) m_lvContacts.getItemAtPosition(position);
String szDisplayName = cursor.getString(cursor.getColumnIndexOrThrow( ContactsContract.Contacts.DISPLAY_NAME));
String szId = cursor.getString(cursor.getColumnIndexOrThrow( ContactsContract.Contacts._ID));
int nId = cursor.getInt(cursor.getColumnIndexOrThrow( ContactsContract.Contacts._ID));
Log.d(LOG_TAG, "Item click:"+position+" szId:"+szId+" nId:"+nId+" Data:"+szDisplayName);
Toast.makeText(getBaseContext(), "Item click:"+phoneNumber+" szId:"+szId+" nId:"+nId+" Data:"+szDisplayName, Toast.LENGTH_SHORT).show();
【问题讨论】:
看这里***.com/questions/3370628/… 我使用了上面的链接,但 phoneindex 产生了价值 ***.com/questions/3044545/… 尝试在SO上搜索。这样的问题已经问过了,你只需安排一下 【参考方案1】:试试这个
ArrayList<String> phones = new ArrayList<String>();
Cursor cursor = mContentResolver.query(
CommonDataKinds.Phone.CONTENT_URI,
null,
CommonDataKinds.Phone.CONTACT_ID +" = ?",
new String[]id, null);
while (cursor.moveToNext())
phones.add(cursor.getString(cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER)));
cursor.close();
return(phones);
【讨论】:
我不想要电话号码列表,我需要一个特定号码 你检查了吗?我认为它只返回一个数字【参考方案2】:试试这个
public void getNameUsingContactId(String contactId)
String cContactIdString = ContactsContract.Contacts._ID;
Uri cCONTACT_CONTENT_URI = ContactsContract.Contacts.CONTENT_URI;
String cDisplayNameColumn = ContactsContract.Contacts.DISPLAY_NAME;
String selection = cContactIdString + " = ? ";
String[] selectionArgs = new String[]String.valueOf(contactId);
Cursor cursor = mContext.getContentResolver().query(cCONTACT_CONTENT_URI, null, selection, selectionArgs, null);
if ((cursor != null) && (cursor.getCount() > 0))
cursor.moveToFirst();
while ((cursor != null) && (cursor.isAfterLast() == false))
if (cursor.getColumnIndex(cContactIdString) >= 0)
if (contactId.equals(cursor.getString(cursor.getColumnIndex(cContactIdString))))
String name = cursor.getString(cursor.getColumnIndex(cDisplayNameColumn));
break;
cursor.moveToNext();
if (cursor != null)
cursor.close();
【讨论】:
【参考方案3】:您会在数据表中找到电话号码。在rawcontacts表中找到对应的rawcontact id(使用contact ID作为where条件),使用这些raw contact id查询数据表。电话号码将具有特定的 mime 类型(现在远离文档),因此您可以识别它们。 希望这会有所帮助!
提示:从您的模拟器/设备复制contacts2.db 数据库并使用Squirrel(SQLite jdbc 驱动程序)在联系人数据库中四处寻找。 db 位于 /data/data/ 在列表中查找联系人)。
【讨论】:
【参考方案4】:各位,我得到了答案:
如果您需要,请使用此代码:
Cursor cursor = (Cursor) m_lvContacts.getItemAtPosition(position);
String szDisplayName = cursor.getString(cursor.getColumnIndexOrThrow( ContactsContract.Contacts.DISPLAY_NAME));
String szId = cursor.getString(cursor.getColumnIndexOrThrow( ContactsContract.Contacts._ID));
int nId = cursor.getInt(cursor.getColumnIndexOrThrow( ContactsContract.Contacts._ID));
long l = Long.parseLong(szId);
int type=ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE;
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"='"+szId+"'",
null, null);
int phoneNumberIndex = cursor
.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER);
Log.d(TAG, String.valueOf(cursor.getCount()));
if (cursor != null)
Log.v(TAG, "Cursor Not null");
try
if (cursor.moveToNext())
Log.v(TAG, "Moved to first");
Log.v(TAG, "Cursor Moved to first and checking");
phoneNumber = cursor.getString(phoneNumberIndex);
System.out.println("HAGSd"+phoneNumber);
finally
Log.v(TAG, "In finally");
cursor.close();
【讨论】:
【参考方案5】:public static final String contactIdByPhoneNumber(Context ctx, String phoneNumber)
String contactId = null;
if (phoneNumber != null && phoneNumber.length() > 0)
ContentResolver contentResolver = ctx.getContentResolver();
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
String[] projection = new String[] PhoneLookup._ID ;
Cursor cursor = contentResolver.query(uri, projection, null, null, null);
if (cursor != null)
while (cursor.moveToNext())
contactId = cursor.getString(cursor.getColumnIndexOrThrow(PhoneLookup._ID));
cursor.close();
return contactId;
【讨论】:
以上是关于如何使用联系人 ID 获取特定的联系电话的主要内容,如果未能解决你的问题,请参考以下文章
如何使用联系人 id 和查找键获取 rawcontact id