我尝试使用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";
}
答案 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();
}
}