Android - 使用国家/地区代码与号码联系

cra*_*ool 11 java sql android android-contacts

从传入短信中检索移动号码时,会附加国家/地区代码.
现在,因为数据库中的匹配联系人可能不包含国家代码来获取我正在使用的联系人姓名:

public static String getContactName(String number, Context context) {

    try {

        Uri personUri = Uri.withAppendedPath(
            ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number.trim()));
        String selection = PhoneLookup.NUMBER + " LIKE %" + number.trim() + "%";
        Cursor cur = context.getContentResolver().query(personUri,
            new String[] {
            PhoneLookup.DISPLAY_NAME
        },
            selection, null, null);
        if (cur.moveToFirst()) {
            String str = cur.getString(cur.getColumnIndex(PhoneLookup.DISPLAY_NAME));
            cur.close();
            return str;
        }
    } catch (Exception e) {
        //e.printStackTrace();
        return number;
    }
    return number;
}
Run Code Online (Sandbox Code Playgroud)

如果我传入完全匹配或部分匹配,这将完美地工作.但是,如果我想获取联系人ID我正在使用此代码:

public static Contact getContact(String number, ContentResolver contentResolver) {

    Contact contact = new Contact(-1, number);
    try {
        Uri personUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(number));
        String selection = ContactsContract.CommonDataKinds.Phone.NUMBER + " LIKE '%" + number + "%'";
        Cursor cur = contentResolver.query(personUri,
            new String[] {
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID, PhoneLookup.DISPLAY_NAME
        },
            selection, null, null);
        if (cur.moveToFirst()) {
            contact = new Contact(Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID))),
                cur.getString(cur.getColumnIndex(PhoneLookup.DISPLAY_NAME)));
        }
        cur.close();
    } catch (Exception e) {}
    return contact;
}
Run Code Online (Sandbox Code Playgroud)

如果数字是精确匹配,这种方法很完美,但如果不是,则不返回任何内容.我需要这种方法来查找联系人的ID,其号码保存为"01111111111",传入号码为"+441111111111".虽然他们正在查看不同的URI,但选择代码几乎相同,所以我不确定为什么它不适用于第二种.

有任何想法吗?

AMD*_*AMD 9

我使用此代码进行相同的处理,并通过从相同的代码返回contactId返回名称,您的问题将得到解决

public static String getContactDisplayNameByNumber(String number) {
    Uri uri = Uri.withAppendedPath(
            ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
            Uri.encode(number));
    String name = "?";

    ContentResolver contentResolver = context.getContentResolver();
    Cursor contactLookup = contentResolver.query(uri, new String[] {
            BaseColumns._ID, ContactsContract.PhoneLookup.DISPLAY_NAME },
            null, null, null);

    try {
        if (contactLookup != null && contactLookup.getCount() > 0) {
            contactLookup.moveToNext();
            name = contactLookup.getString(contactLookup
                    .getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
            // String contactId =
            // contactLookup.getString(contactLookup.getColumnIndex(BaseColumns._ID));
        }
    } finally {
        if (contactLookup != null) {
            contactLookup.close();
        }
    }

    return name;
}
Run Code Online (Sandbox Code Playgroud)


Pur*_*war 7

上个月我遇到了同样的问题,我设法使用google的libphonenumber库解决了这个问题.

问题只发生在本地/国家电话号码上,因为它们可以在没有国家代码或使用"0"的情况下保存.

例如 :

印度的典型电话号码可以采用以下格式保存

  a. +919665123456
  b. 919665123456
  c. 09665123456
  d. 9665123456
Run Code Online (Sandbox Code Playgroud)

以上每种都是完全有效的格式,只能在印度拨打

但是,如果属于您所在国家/地区以外的电话号码必须通过国家/地区代码保存,或者您将无法拨打电话.

ex. 

 a. +1732-757-2923    (US)
 b. +97433-456-789    (Qatar)
Run Code Online (Sandbox Code Playgroud)

因此,如果有关的联系人,则确实会发生匹配联系人的问题local/national.

这就是libphonenumber图片的所在.使用该库,我们可以提取属于该特定国家/地区的实际国家格式的电话号码.

这是诀窍.首先将收到的数字从短信传递给uri,以便在数据库中进行匹配.如果不匹配,则使用libphonenumber提取国内电话号码,然后再将其作为uri传递以进行匹配.(Uri.encode(number))

它适用于我的情况.

我用以下方式使用它.

public String getContactDisplayNameByNumber(String number) {

    if (number != null && number.length() != 0) {

        String name = lookupNumber(number);

        if (!name.contains(number))
            return name;
        else {

            TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

            String usersCountryISOCode = manager.getNetworkCountryIso();

            PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
            try {
                PhoneNumber phonenUmber = phoneUtil.parse(name,
                        usersCountryISOCode);
                if (phoneUtil.isValidNumber(phonenUmber)) {
                    temp = phoneUtil
                            .getNationalSignificantNumber(phonenUmber);


                    name = lookupNumber(temp);
                    return name;
                }

            } catch (Exception e) {

                e.printStackTrace();

            }
            return number;
        }
    } else {
        return "Invalid Number";
    }
}

private String lookupNumber(String number) {

    uri = Uri.withAppendedPath(
            ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
            Uri.encode(number));
    name = number;

    contentResolver = getContentResolver();
    contactLookup = contentResolver.query(uri, columns, null, null, null);

    try {
        if (contactLookup != null && contactLookup.getCount() > 0) {
            contactLookup.moveToNext();
            name = contactLookup.getString(contactLookup
                    .getColumnIndex(ContactsContract.Data.DISPLAY_NAME));

        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (contactLookup != null) {
            contactLookup.close();
        }
    }

    return name;
}
Run Code Online (Sandbox Code Playgroud)

希望它能解决你的问题.