【问题标题】:Android How to read android Contacts and SIM Contacts?Android 如何读取 android 通讯录和 SIM 通讯录?
【发布时间】:2012-11-14 13:06:06
【问题描述】:

我目前正在获取只读的 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 卡联系人?

感谢您的宝贵时间。

【问题讨论】:

    标签: android android-contacts contactscontract sim-card


    【解决方案1】:

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

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

    【讨论】:

    • 那么没有一种方法可以读取所有有号码的联系人(Android 和 SIM 卡)吗?我只想阅读。
    【解决方案2】:

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

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

    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

    【讨论】:

      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多