Android:使用CursorLoader加载联系人,而不是全部加载

时间:2015-01-25 18:12:39

标签: android android-contacts android-cursorloader

我的Android应用程序应该加载设备中记录的所有联系人并将其显示在列表中。我还没有找到原因,但并非所有联系人都被加载。

以下是我使用CursorLoader启动查询的代码:

public android.support.v4.content.Loader<Cursor> onCreateLoader(int id, Bundle args) {

        if (id == ContactsQuery.QUERY_ID) {
            Uri contentUri;


            if (mSearchTerm == null) {
                contentUri = ContactsQuery.CONTENT_URI;
            } else {
                contentUri =
              Uri.withAppendedPath(ContactsQuery.FILTER_URI, Uri.encode(mSearchTerm));
        }

        return new CursorLoader(getActivity(),
                contentUri,
                ContactsQuery.PROJECTION,
                ContactsQuery.SELECTION,
                null,
                ContactsQuery.SORT_ORDER);

ContactsQuery的定义如下:

public interface ContactsQuery {

    final static int QUERY_ID = 1;

    final static Uri CONTENT_URI = Contacts.CONTENT_URI;

    final static Uri FILTER_URI = Contacts.CONTENT_FILTER_URI;

    @SuppressLint("InlinedApi")
    final static String SELECTION =
            (Utils.hasHoneycomb() ? Contacts.DISPLAY_NAME_PRIMARY : Contacts.DISPLAY_NAME) +
            "<>''" + " AND " + Contacts.IN_VISIBLE_GROUP + "=1";

    @SuppressLint("InlinedApi")
    final static String SORT_ORDER =
            Utils.hasHoneycomb() ? Contacts.SORT_KEY_PRIMARY : Contacts.DISPLAY_NAME;

    @SuppressLint("InlinedApi")
    final static String[] PROJECTION = {

            // The contact's row id
            Contacts._ID,

            Contacts.LOOKUP_KEY,

            Utils.hasHoneycomb() ? Contacts.DISPLAY_NAME_PRIMARY : Contacts.DISPLAY_NAME,

            Utils.hasHoneycomb() ? Contacts.PHOTO_THUMBNAIL_URI : Contacts._ID,

            SORT_ORDER,
    };

    final static int ID = 0;
    final static int LOOKUP_KEY = 1;
    final static int DISPLAY_NAME = 2;
    final static int PHOTO_THUMBNAIL_DATA = 3;
    final static int SORT_KEY = 4;
}

当mSearchTerm为空时,为什么没有加载所有联系人?

2 个答案:

答案 0 :(得分:1)

您只是拉下手机联系人的内容 - 由于手机的设置,可能会或可能无法访问存储在SIM卡上的联系人(例如,如果手机已禁止访问SIM卡联系人)。

Here is a post将向您展示如何单独阅读它们。

您可以使用以下方法识别两者之间:

//for SIM Card 
ContentValues values = new ContentValues();
values.put(RawContacts.ACCOUNT_TYPE, "com.android.contacts.sim");
values.put(RawContacts.ACCOUNT_NAME, "SIM");
Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values);

//for everyone else
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
values.put(StructuredName.DISPLAY_NAME, "Name");

答案 1 :(得分:0)

问题在于选择。违规行是

final static String SELECTION =
        (Utils.hasHoneycomb() ? Contacts.DISPLAY_NAME_PRIMARY : Contacts.DISPLAY_NAME) +
        "<>''" + " AND " + Contacts.IN_VISIBLE_GROUP + "=1";

缺少的联系人有Contacts.IN_VISIBLE_GROUP&lt;&gt; 1.这种行为似乎有点病态,因为看起来内置应用程序(例如我的母亲)的联系人列表中显示的完全有效的联系人不在可见组中。我实施了一个kludge:

final static String SELECTION =
            (Utils.hasHoneycomb() ? Contacts.DISPLAY_NAME_PRIMARY : Contacts.DISPLAY_NAME) +
            "<>'' AND ("+Contacts.HAS_PHONE_NUMBER+"=1 OR "+Contacts.IN_VISIBLE_GROUP+" = 1)";

这对我的应用来说已经足够了。