【问题标题】:Cursor to get the contacts returns null获取联系人的光标返回 null
【发布时间】:2016-03-14 07:25:02
【问题描述】:

在我的应用程序中,我想从电话簿中获取所有联系人。我编写的代码总是给我空cursor

代码

//在后台获取联系人

static class GetContacts extends AsyncTask<Void, Void, List<ContactsModel>> {
    private Context context;
    private ContentResolver contactResolver;
    private ContactsModel contactsModel;
    private List<String> listPhones = Collections.emptyList();
    private List<String> listEmails = Collections.emptyList();
    private List<ContactsModel> listContacts = Collections.emptyList();
    private String phone;
    private String email;
    private String id;
    private Cursor phoneCursor;
    private Cursor emailCursor;

    public GetContacts(Context context) {
        this.context = context;

    }

    @Override
    protected List<ContactsModel> doInBackground(Void... params) {

        contactResolver = context.getContentResolver();
        Cursor cur = contactResolver.query(ContactsContract.Contacts.CONTENT_URI,
                null, null, null, null);
        if (cur.getCount() > 0) {
            while (cur.moveToNext()) {
                contactsModel = new ContactsModel();

                id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                contactsModel.name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

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

                    phoneCursor = contactResolver.query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            null,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                            new String[]{id}, null);

                    while (phoneCursor.moveToNext()) {
                        // Do something with phones
                        int phoneType = phoneCursor.getInt(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
                        String phoneNo = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        //you will get all phone numbers according to it's type as below switch case.
                        switch (phoneType) {
                            case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
                                phone = phoneNo;
                                break;
                            case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
                                phone = phoneNo;
                                break;
                            case ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
                                phone = phoneNo;
                                break;
                            case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE:
                                phone = phoneNo;
                                break;
                            case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER:
                                phone = phoneNo;
                                break;
                            default:
                                break;
                        }

                        listPhones.add(phone);
                    }


                    emailCursor = contactResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                            null,
                            ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null);

                    while (emailCursor.moveToNext()) {
                        //String emai = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                        int type = emailCursor.getInt(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
                        String s = (String) ContactsContract.CommonDataKinds.Email.getTypeLabel(context.getResources(), type, "");
                        listEmails.add(emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)));

                    }

                    listContacts.add(contactsModel);
                    emailCursor.close();
                    phoneCursor.close();


                }


            }


        }

        cur.close();


        return listContacts;
    }

    @Override
    protected void onPostExecute(List<ContactsModel> contactsModels) {


    }
}

//活动代码

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.all_contact_list);
        init();

    }


    protected void init() {
        context = this;
        progressBar = (ProgressBar) findViewById(R.id.pb_all_contacts);
        new GetContacts(context).execute();


    }

我的通讯录中有超过 1000 个联系人

P.S - I also have requested permission to read contact in manifest

【问题讨论】:

    标签: android android-contacts


    【解决方案1】:

    在你的代码中,我在onPostExecute 上看到的方法是空的。我认为在这种方法中你必须设置你已经填充的list

    @Override
        protected void onPostExecute(List<ContactsModel> contactsModels) {
           listContacts = contactsModels;
        }
    

    因为您从手机中检索doInBackground 中的数据,但是您将其传递到了哪里?希望有所帮助!

    【讨论】:

    • 但我没有得到任何联系人
    • 我不理解你很抱歉......你的返回列表联系人在你的 doInBAckground 的末尾,但这个列表不是分配的,我认为错误来自它,但我可能是错的......在你的 doInBackground 方法中如果你记录你的列表是空的吗?
    • 在 doInbackground 如果我运行调试器,它不会进入 if(cur.getCount>0)
    • 您尝试过使用 Log 吗?
    • 是的还是一样
    【解决方案2】:

    您需要在向内容提供者查询时进行投影。

    String[] mProjection =
    {
        UserDictionary.Words._ID,    // Contract class constant for the _ID column name
        UserDictionary.Words.WORD,   // Contract class constant for the word column name
        UserDictionary.Words.LOCALE  // Contract class constant for the locale column name
    };
    
    
    contactResolver = context.getContentResolver();
            Cursor cur = contactResolver.query(ContactsContract.Contacts.CONTENT_URI,
                    mProjection, null, null, null);
    

    以上只是查询内容提供者时的投影示例。

    你可以参考这个链接, http://developer.android.com/guide/topics/providers/content-provider-basics.html http://developer.android.com/training/contacts-provider/retrieve-details.html

    【讨论】:

    • projection 要返回的列的列表。传null会返回所有列,效率低。
    猜你喜欢
    • 2020-09-19
    • 2013-12-15
    • 1970-01-01
    • 2016-05-01
    • 2015-12-16
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多