android获取自定义联系人类型标签名称

时间:2012-11-20 03:40:38

标签: java android contacts

我无法了解如何查询自定义电话号码类型。就像你进入联系人 - 编辑联系人并将其中一个电话号码更改为自定义标签一样。有没有办法让名字输入自定义类型标签?
我试过了

  

" android.content.res.Resources.getSystem()。getStringArray(   android.R.array.phoneTypes)"

但它似乎崩溃了应用程序,我认为它是旧版本的android  我也试过

  

curser.getString(curser.getColumnIndex(ContactsContract.CommonDataKinds.Phone       .LABEL)"

如果有人有任何想法,我会非常感激,或者如果存在的话我可能会指出一个副本,但我找不到它。

3 个答案:

答案 0 :(得分:3)

现在我一直在做同样的事情,确保你的查询是正确的(我正在查询ContactsContract.CommonDataKinds.Phone.CONTENT_URI)(确保你的投影是正确的,等等)你可以做下面这样的事情,我想你面临的困难是拿起预设标签而不是自定义标签。预设标签在TYPE列中表示为整数,而如果TYPE == TYPE_CUSTOM,则LABEL字段将包含您要查找的数据。

从TYPE中的数字移动到字符串是使用提供的方法。虽然我认为已经处理了,但我不确定本地化。

Cursor curse = mContext.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.LABEL}, 
                        ContactsContract.CommonDataKinds.Phone.NUMBER + " = ?", new String[]{numnum}, null);
                int colIndex = curse.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
                int lblIndex = curse.getColumnIndex(ContactsContract.CommonDataKinds.Phone.LABEL);
                ArrayList<String> numbers = new ArrayList<String>();
                String cur = "";
                while(curse.moveToNext())
                {
                    int labelType = curse.getInt(colIndex);
                    if(labelType == ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM)
                    {
                        cur = curse.getString(lblIndex);
                    }
                    else
                    {
                        CharSequence seq = ContactsContract.CommonDataKinds.Phone.getTypeLabel(mContext.getResources(), labelType, "Mobile");
                        cur = seq.toString();
                    }
                    numbers.add(cur);
                }
                curse.close();

在此片段的末尾,您最终会得到一个字符串的字符串,其中包含用于此电话号码的标签。请注意,电话号码必须非常精确匹配,因此444-4444与4444444不匹配,反之亦然。

个人而言,我没有时间试验将“Mobile”或“”放在getTypeLabel的最后一个变量之间的区别,尽管它似乎还没有产生影响。

希望这个答案还不算太晚。

答案 1 :(得分:0)

这是我的代码。

首先,获取类型和标签。

并使用getTypeLabel函数获取标签。

fun getPhoneNumbers(contactId: String): ArrayList<ContactNumber> {
        val result = ArrayList<ContactNumber>()

/*///////////////////////////get type and custom label*/

        val phoneFetchCursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                arrayOf(ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE,ContactsContract.CommonDataKinds.Phone.LABEL),
                ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID + "=" + contactId, null, null)


        while (phoneFetchCursor.moveToNext()) {
            val num = phoneFetchCursor.getString(phoneFetchCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
            val typ = phoneFetchCursor.getInt(phoneFetchCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE))
            val label = phoneFetchCursor.getString(phoneFetchCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.LABEL))


 /*///////////////////////////getTypeLabel's third parameter is custom label. 
when it is null then it returns localized default label.*////////////////////////
            val typName = ContactsContract.CommonDataKinds.Phone.getTypeLabel(context.resources, typ!!, label).toString()

            var contactNumber = ContactNumber(contactId, num, typ,typName)
            result.add(contactNumber)
        }
        phoneFetchCursor.close()

        return result
    }

答案 2 :(得分:0)

通过这种方式,您将在typeName中获得标准或自定义标签。 (crPhones是迭代与单个联系人关联的号码的光标):

String label = crPhones.getString(crPhones.
        getColumnIndex(ContactsContract.CommonDataKinds.Phone.LABEL));
int type = crPhones.getInt(crPhones.
        getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
String typeName = ContactsContract.CommonDataKinds.Phone.
        getTypeLabel(context.getResources(), type, label).toString();