从Android 2.3.4中的号码获取联系人姓名

时间:2012-01-09 07:30:21

标签: android

我尝试使用2.3.4 android中的数字获取联系人的名称,但它无法正常工作..这里我附加了我的代码。请帮助..我已经尝试了很多方式,如Stack over flow,在模拟器中工作,但在手机中运行时失败..

String[] projection = new String[] { Contacts.Phones.DISPLAY_NAME, 
                                     Contacts.Phones.NUMBER };

// encode the phone number and build the filter URI
Toast.makeText(context, "sender: "+sender, Toast.LENGTH_LONG).show();

Uri contactUri = Uri.withAppendedPath(Contacts.Phones.CONTENT_FILTER_URL,
                                      Uri.encode(sender));

// query time
Cursor c = context.getContentResolver().query(contactUri, projection, null,
                                              null, null);

// if the query returns 1 or more results
// return the first result
if(c.getCount()>0){
    if (c.moveToFirst()) {
        name = c.getString(c.getColumnIndex(Contacts.Phones.DISPLAY_NAME));
    }                
}else{
    name="UnKnown";
}

2 个答案:

答案 0 :(得分:4)

查看Contacts.Phones.NUMBER的API:

  

public static final String NUMBER

     

用户输入的电话号码。

因此,您在程序中使用的数字必须指定与电话簿中的完全相同的(逐个字符)。这可能是因为您的电话簿可能包含+46xxxxxxxx等国家/地区代码信息而导致手机失败的原因。

要解决此问题,请使用PhoneLookup中的ContactsContract,它将使用算法检查数字是否相等(同样, 来自Contacts.Phones的常量已弃用):

public static String getContactName(String num, ContentResolver cr) {

    Uri u = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI Uri.encode(num));
    String[] projection = new String[] { ContactsContract.Contacts.DISPLAY_NAME};

    Cursor c = cr.query(u, projection, null, null, null);

    try {
        if (!c.moveToFirst())
            return number;

        int index = c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
        return c.getString(index);

    } finally {
        if (c != null)
            c.close();
    }
}

(如果未找到与该号码的联系,此代码将返回该号码。)

答案 1 :(得分:0)

您可以更好地使用游标加载器,因此无法阻止主线程。获取索引然后获取字符串是非常的。

    private String getContactName(String num) {

    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(num));
    String[] projection = new String[] {ContactsContract.Contacts.DISPLAY_NAME};

    CursorLoader cursorLoader = new CursorLoader(getActivity(), uri, projection, null, null,null);

    Cursor c = cursorLoader.loadInBackground();

    try {
        if (!c.moveToFirst())
            return num;

        return c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
    } catch (Exception e)
    {
        Log.e(TAG,"Error looking up the contactname." + e);
        return num;
    }
    finally {
        if (c != null)
            c.close();
    }
}