【问题标题】:Android Contacs安卓通讯录
【发布时间】:2012-02-26 01:57:21
【问题描述】:

我能够从 android 的联系人列表中获取所有联系人(电话号码和电子邮件) 但是获取所有这些需要很长时间。 为了加快速度,我将它们存储在我的应用程序中一次。但现在我无法获取更新的联系人。它们需要如何与我的应用程序同步?

当我尝试在列表中显示它们时出现问题,因为电话号码和电子邮件的用户数据库超过了 2000。我目前正在为此使用基本适配器实现。 有人可以帮我获取大型联系人数据库吗?

像 GroupMe n Viber 这样的应用程序可以非常快速地显示所有用户联系人,有人可以告诉我实现它的简要说明。

String KEY_NAME = "Name";
    String KEY_NO   = "No";

    String selection = ContactsContract.CommonDataKinds.Phone.IN_VISIBLE_GROUP + " = 1";
    String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

    String data="";
    String name="";
    ContactEntry contactObj;
    String id;
    String index="";


    final String[] projection = new String[]{ContactsContract.Contacts._ID , ContactsContract.Contacts.DISPLAY_NAME , ContactsContract.Contacts.HAS_PHONE_NUMBER};

    final String[] email_projection = new String[] {ContactsContract.CommonDataKinds.Email.DATA , ContactsContract.CommonDataKinds.Email.TYPE};

    final String[] phone_projection = new String[] {ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE};

    ContentResolver cr = context.getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI , projection , selection , null , sortOrder);

    if(cur.getCount()>0){

        while(cur.moveToNext()){

             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) {

                // get the phone number
                Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI , phone_projection , 
                                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{id}, null);


                while (pCur.moveToNext()){

                         data = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                        if(!temp.contains(data) && !data.equals(null)){
                            //Adding PhoneNumbers in List   
                        }
                } 
                    pCur.close();
            }

           Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, email_projection,
                                        ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",  new String[]{id}, null); 


           while (emailCur.moveToNext()){ 

                data = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

                if(!temp.contains(data) && !data.equals(null)){ 
                                  //Adding Email in List
                }
            } 
            emailCur.close();
        }
    }

我已经使用了上面的代码 我如何在 CurosrAdaper 中为所有电子邮件和电话号码传递 Curser。 请帮助我,我还没有找到任何解决方案。

【问题讨论】:

  • 您在从 fon 数据库中获取联系人时是否使用了投影?

标签: android android-listview contacts android-contacts contactscontract


【解决方案1】:

Android 提供了一个同步适配器来解决这个问题。你可以参考这个例子来实现。 http://developer.android.com/resources/samples/SampleSyncAdapter/index.html

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我使用了 ResourceCursorAdapter,它从 android 获取联系人的速度与 Contact API 一样快......

    【讨论】:

    • 如何使用 ResourceCursorAdapter 查询所有 PhoneNumbers 和 Emails 参见我上面的代码。
    【解决方案3】:

    我认为您需要一个服务(或)异步任务,例如定期将联系人从手机更新到本地应用程序。否则无法同步。

    【讨论】:

    • 嗨,这将非常昂贵,而不是我认为每次应用程序启动时都会刷新它的联系人或重新加载联系人而不是存储它们。请建议一种在我的列表中显示它们的方法以上代码。
    猜你喜欢
    • 2011-04-04
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2012-06-15
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多