android中的联系人

时间:2011-02-03 17:53:52

标签: android

我想从android.i中的设备获取所有手机联系人已使用以下代码。但问题是返回结果需要更多时间。是否有任何解决方案?

ContentResolver cr = getContentResolver();
        int index=0;
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
                null, null, null, null);

        if (cur.getCount() > 0) 
        {
            phoneNames=new String[cur.getCount()];
            phoneNumbers=new String[cur.getCount()];
        while (cur.moveToNext())
        {
            String id = cur.getString(
                        cur.getColumnIndex(ContactsContract.Contacts._ID));
             name = cur.getString(
                        cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));



        if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
        {

             phoneNames[index]=name;
            Cursor pCur = cr.query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
                    null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
                    new String[]{id}, null);


                    while (pCur.moveToNext()) 
                    {
                        phoneIndex++;
                        phoneNumbers[index] = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        index++;
                    } 
                    pCur.close();

            }     
        }  

2 个答案:

答案 0 :(得分:2)

阅读完代码后,我假设你想要的是一个带有DISPLAY NAMES的联系人列表及其各自的电话号码。

如果您专门寻找与电话号码相关的数据,我建议您查询 android.provider.ContactsContract.PhoneLookup并使用单个游标获取结果。 以下是您感兴趣的字段: 显示名称 HAS_PHONE_NUMBER 数 TYPE

例如

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
 resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME,...

更多详情请参阅this

如果假设不正确,请发布您的要求。

  • 一些快速检查:

    1. 仅在第一个查询中选择所需的列而不是全部。
    2. 而不是使用Integer.parseInt(cur.getString) cur.getInt()
    3. 每当处理电话号码时使用PhoneLookup(号码 字段给出原始电话号码 而不是存储在中的值 可以包含的数据库 - ,),(附上)
    4. 避免在游标中使用光标。使用包含的API 连接已经在它中实现了 RawContactsEntity,PhoneLookup。

希望有所帮助。

答案 1 :(得分:0)

不要在UI线程上执行复杂的数据库查询。你想对结果做什么?如果您要在列表中显示内容,请使用CursorAdapter,这样您只需在需要时提取所需内容。