尝试将电话号码列入黑名单时,联系ID不匹配

时间:2013-10-07 09:45:00

标签: android android-contacts

我正在使用下面的联系人选择器来获取联系人的ID。

public void pickContact() {
    Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
    intent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
    startActivityForResult(intent, PICK_CONTACT_REQUEST);
}

然后我使用此方法从上面返回的uri中检索联系人ID。并存储它作为参考。

public static long getContactIdByUri(Context context, Uri uri)
{
    Log.d(TAG, uri.toString());
    String[] projection = { Contacts._ID };
    Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
    try
    {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(Contacts._ID);
        long id = -1;

        if(idx != -1)
        {
            id = cursor.getLong(idx);
        }
        return id;
    }
    finally
    {
        cursor.close();
    }
}

稍后当有文字信息到达时,我会提取电话号码并根据该信息尝试使用以下内容查找联系人ID。

public static long getContactIdByPhoneNumber(Context context, String phoneNumber) {
    ContentResolver contentResolver = context.getContentResolver();
    Uri uri = Uri.withAppendedPath(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) {
        return -1;
    }
    int idx = cursor.getColumnIndex(PhoneLookup._ID);
    long id = -1;
    if(cursor.moveToFirst()) {
        id = cursor.getLong(idx);
    }
    if(cursor != null && !cursor.isClosed()) {
        cursor.close();
    }
    return id;
}

问题是那两个id不匹配!

所以基本上问题是如何从联系人选择器中获取一个ID,我可以在使用PhoneLookup.CONTENT_FILTER_URI查找电话号码时找到该ID。我还可以用它来获取有关联系人的其他信息?

1 个答案:

答案 0 :(得分:0)

从联系人选择器返回的url引用ContactsContract.Data提供程序,该提供程序与ContactsContract.RawContacts连接,后者又包含CONTACT_ID。

因此,使用以下方法提取实际联系人ID是微不足道的。

   public static long getContactIdByDataUri(Context context, Uri uri)
   {
          String[] projection = new String[] { Data.CONTACT_ID };
          Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
          long id = -1;
          if(cursor.moveToFirst()) {
                 id = cursor.getLong(0);
          }
          return id;
   }