【问题标题】:How to get contacts from native phonebook in android如何从android中的本机电话簿中获取联系人
【发布时间】:2011-06-06 13:51:40
【问题描述】:

我想在列表中显示所有本地联系人,并让用户将列表中的联系人(多个联系人)添加到我的应用程序数据库中。如何做到这一点任何人都可以给我一些想法或分享一些代码.. 提前谢谢..

【问题讨论】:

    标签: android


    【解决方案1】:

    我在 Android 2.1 上使用了此代码。它拉下任何拥有电话号码(由 String SELECTION 变量定义)的人,并返回一个 Person 类型的 List。 Person 是一个包含用户姓名和电话号码的对象。您必须实现一个 Person 对象才能使用此代码,但它可以完美运行:

    public List<Person> getContactList(){
            ArrayList<Person> contactList = new ArrayList<Person>();
    
            Uri contactUri = ContactsContract.Contacts.CONTENT_URI;
            String[] PROJECTION = new String[] {
                    ContactsContract.Contacts._ID,
                    ContactsContract.Contacts.DISPLAY_NAME,
                    ContactsContract.Contacts.HAS_PHONE_NUMBER,
            };
            String SELECTION = ContactsContract.Contacts.HAS_PHONE_NUMBER + "='1'";
            Cursor contacts = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, PROJECTION, SELECTION, null, null);
    
    
            if (contacts.getCount() > 0)
            {
                while(contacts.moveToNext()) {
                    Person aContact = new Person();
                    int idFieldColumnIndex = 0;
                    int nameFieldColumnIndex = 0;
                    int numberFieldColumnIndex = 0;
    
                    String contactId = contacts.getString(contacts.getColumnIndex(ContactsContract.Contacts._ID));
    
                    nameFieldColumnIndex = contacts.getColumnIndex(PhoneLookup.DISPLAY_NAME);
                    if (nameFieldColumnIndex > -1)
                    {
                        aContact.setName(contacts.getString(nameFieldColumnIndex));
                    }
    
                    PROJECTION = new String[] {Phone.NUMBER};
                    final Cursor phone = managedQuery(Phone.CONTENT_URI, PROJECTION, Data.CONTACT_ID + "=?", new String[]{String.valueOf(contactId)}, null);
                    if(phone.moveToFirst()) {
                        while(!phone.isAfterLast())
                        {
                            numberFieldColumnIndex = phone.getColumnIndex(Phone.NUMBER);
                            if (numberFieldColumnIndex > -1)
                            {
                                aContact.setPhoneNum(phone.getString(numberFieldColumnIndex));
                                phone.moveToNext();
                                TelephonyManager mTelephonyMgr;
                                mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                                if (!mTelephonyMgr.getLine1Number().contains(aContact.getPhoneNum()))
                                {
                                    contactList.add(aContact);  
                                }
                            }
                        }
                    }
                    phone.close();
                }
    
                contacts.close();
            }
    
            return contactList;
        }
    

    编辑:基本的 Person 类:

    public class Person {
        String myName = "";
        String myNumber = "";
    
        public String getName() {
            return myName;
        }
    
        public void setName(String name) {
            myName = name;
        }
    
        public String getPhoneNum() {
            return myNumber;
        }
    
        public void setPhoneNum(String number) {
            myNumber = number;
        }
    }
    

    【讨论】:

    • 如果你能分享Person类就好了。
    • 我不再有这个项目的特定代码,或者我把它藏在家里的某个地方。但是,我编写了一个基本的 Person 类,它至少应该可以与我提交的其他代码一起使用。
    • 尝试 this.java.lang.NullPointerException 时出现空指针异常:尝试在空对象引用。在 if (!mTelephonyMgr.getLine1Number().contains(aContact.getmMobileNo())) 这一行。 @乔恩
    • 你是如何实现的? @NajibPuthawala
    【解决方案2】:

    此代码在 android 4.2 中完美运行。而且它的工作速度更快,因为您不需要为每个联系人进行额外的查询

    private static final String CONTACT_ID = ContactsContract.Contacts._ID;
    private static final String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME;
    private static final String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER;
    
    private static final String PHONE_NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;
    private static final String PHONE_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID;
    
    public static ArrayList<Contact> getAll(Context context) {
        ContentResolver cr = context.getContentResolver();
    
        Cursor pCur = cr.query(
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                new String[]{PHONE_NUMBER, PHONE_CONTACT_ID},
                null,
                null,
                null
        );
        if(pCur != null){
            if(pCur.getCount() > 0) {
                HashMap<Integer, ArrayList<String>> phones = new HashMap<>();
                while (pCur.moveToNext()) {
                    Integer contactId = pCur.getInt(pCur.getColumnIndex(PHONE_CONTACT_ID));
                    ArrayList<String> curPhones = new ArrayList<>();
                    if (phones.containsKey(contactId)) {
                        curPhones = phones.get(contactId);
                    }
                    curPhones.add(pCur.getString(pCur.getColumnIndex(PHONE_CONTACT_ID)));
                    phones.put(contactId, curPhones);
                }
                Cursor cur = cr.query(
                        ContactsContract.Contacts.CONTENT_URI,
                        new String[]{CONTACT_ID, DISPLAY_NAME, HAS_PHONE_NUMBER},
                        HAS_PHONE_NUMBER + " > 0",
                        null,
                        DISPLAY_NAME + " ASC");
                if (cur != null) {
                    if (cur.getCount() > 0) {
                        ArrayList<Contact> contacts = new ArrayList<>();
                        while (cur.moveToNext()) {
                            int id = cur.getInt(cur.getColumnIndex(CONTACT_ID));
                            if(phones.containsKey(id)) {
                                Contact con = new Contact();
                                con.setMyId(id);
                                con.setName(cur.getString(cur.getColumnIndex(DISPLAY_NAME)));
                                con.setPhone(TextUtils.join(",", phones.get(id).toArray()));
                                contacts.add(con);
                            }
                        }
                        return contacts;
                    }
                    cur.close();
                }
            }
            pCur.close();
        }
        return null;
    }
    

    Contact 类与答案中的Person 类相似。

    【讨论】:

    • 你为什么加入这个号码?它在一个数组中?我想要一个联系人的手机号码。@Никита Лещёв
    • @Sid 是的,这是一个数组,因为联系人可能有多个电话号码。如果您只想要一个号码,您可以获取第一个号码并忽略所有其他号码,或者您可以检查电话号码的“默认”选项。
    猜你喜欢
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 2015-07-20
    • 2011-04-02
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    相关资源
    最近更新 更多