Android如何阅读Android联系人和SIM联系人?

时间:2012-11-27 00:02:26

标签: android android-contacts contactscontract sim-card

我目前正在阅读只有Android的联系人,下面是我正在使用的代码:

String[] projecao = new String[] { Contacts._ID,
    Contacts.LOOKUP_KEY, Contacts.DISPLAY_NAME };
String selecao = Contacts.HAS_PHONE_NUMBER + " = 1";
Cursor contatos = contexto.getContentResolver().query(
    ContactsContract.Contacts.CONTENT_URI, projecao, selecao, null, null);

获取电话号码:

Cursor phones = contexto.getContentResolver().query(
                Phone.CONTENT_URI,
                new String[] { Phone.NUMBER },
                Phone.CONTACT_ID + " = ?",
                new String[] { contatos.getString(contatos
                        .getColumnIndex(Contacts._ID)) }, null);

我想维护一个包含数字的所有联系人的数据库。

我还要做什么才能获得SIM卡联系人?

感谢您的时间。

3 个答案:

答案 0 :(得分:1)

要获得手机联系人,您可以访问此link

对于SIM卡联系人,请点击here

答案 1 :(得分:0)

您正在阅读的联系人来自Contacts Provider,它是Android平台的一部分。它们不是只读的,但在尝试更改之前应阅读文档。

SIM卡联系人完全不同。它们分别存储在SIM卡本身上,您可能需要使用手机制造商或服务提供商提供的应用程序才能访问它们。它们与Google通讯录无关。我建议不要用它们做任何事情。

答案 2 :(得分:0)

首先,为每个联系人运行电话查询的效率非常低,并且可能会导致您的代码在具有大量联系人的设备上运行几分钟 (!!)。

以下代码可以通过一个快速查询获得您需要的所有信息:

class Contact {
    Long id;
    String name;
    String lookupKey;
    List<String> phones = new ArrayList<>();

    public Contact(Long id, String name, String lookupKey, String number) {
        this.id = id;
        this.name = name;
        this.lookupKey = lookupKey;
        this.phones.add(number);
    }
}

Map<Long, Contact> contacts = new HashMap<Long, PhoneContact>();

String[] projection = {Data.CONTACT_ID, Data.DISPLAY_NAME, Data.LOOKUP_KEY, Phone.NUMBER};
String selection = Data.MIMETYPE + " IN ('" + Phone.CONTENT_ITEM_TYPE + "')"; 

Cursor cur = cr.query(Data.CONTENT_URI, projection, selection, null, null);

while (cur.moveToNext()) {
    long id = cur.getLong(0);
    String name = cur.getString(1);
    String lookup = cur.getString(2);
    String number = cur.getString(3)

    if (!contacts.containsKey(id)) {
        Contact newContact = new Contact(id, name, lookup, number);
        contacts.put(id, phoneContact);
    } else {
        Contact existingContact = contacts.get(id);
        existingContact.phones.add(number);
    }
}
cur.close();

关于 SIM 卡联系人,它们已经存储在同一个数据库中,并且可以通过 ContactsContract 访问,这意味着存储在 SIM 卡上的所有手机也应该使用上述代码接收。

如果您只想查询 SIM 卡联系人,请在此处查看我的回答:https://stackoverflow.com/a/49624417/819355