首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取并选择android中的联系人

获取并选择android中的联系人
EN

Stack Overflow用户
提问于 2015-07-15 06:17:00
回答 1查看 1.4K关注 0票数 2

我正在试着找出所有的联系人并选择它。

我在手机里完成了所有的联络。但是,当我试图选择几个联系人并获取它们的名称或数字时,我遇到了空指针错误。

代码语言:javascript
复制
public class ContactListFragment extends ListFragment implements LoaderCallbacks<Cursor> {

private CursorAdapter mAdapter;
final HashMap<String,String> hashMap = new HashMap<String,String>();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
private Uri uriContact;

private String contactID;
String[] projection    = new String[] {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Phone.NUMBER};


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // create adapter once
    Context context = getActivity();
    int layout = android.R.layout.simple_list_item_multiple_choice;
    Cursor c = null; // there is no cursor yet
    int flags = 0; // no auto-requery! Loader requeries.
    mAdapter = new SimpleCursorAdapter(context, layout, c, FROM, TO, flags);
}



@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    // each time we are started use our listadapter
    setListAdapter(mAdapter);
    getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

    // and tell loader manager to start loading
    getLoaderManager().initLoader(0, null, this);

    ***getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Cursor cursorID = getActivity().getContentResolver().query(uriContact,
                    new String[]{ContactsContract.Contacts._ID},
                    null, null, null);
            contactID = cursorID.getString(cursorID.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            System.out.println(contactID);
        }
    });
}***

// columns requested from the database
private static final String[] PROJECTION = {
        Contacts._ID, // _ID is always required
        Contacts.DISPLAY_NAME_PRIMARY // that's what we want to display
};

// and name should be displayed in the text1 textview in item layout
private static final String[] FROM = { Contacts.DISPLAY_NAME_PRIMARY };
private static final int[] TO = { android.R.id.text1 };

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {

    // load from the "Contacts table"
    Uri contentUri = Contacts.CONTENT_URI;

    // no sub-selection, no sort order, simply every row
    // projection says we want just the _id and the name column
    return new CursorLoader(getActivity(),
            contentUri,
            PROJECTION,
            null,
            null,
            null);
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    // Once cursor is loaded, give it to adapter
    mAdapter.swapCursor(data);

}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    // on reset take any old cursor away
    mAdapter.swapCursor(null);
}

我认为问题是我的onItemClickListener。

我怎么才能解决这个问题?(从现在开始谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-15 07:36:42

主要问题是,当您进行查询时,uriContact是空的。

另一个问题是,您只使用ContactsContract.Contacts._ID作为投影,因此唯一返回的是ID。

我使用null对投影进行处理,这样它就可以返回所有行。

我还增加了功能,以找到当前选择的联系人,并显示一个烤面包与他们的电话号码。

这不是最佳代码,因为它只是查询所有行,然后遍历它们,直到找到当前选定的联系人为止,但它有效:

代码语言:javascript
复制
  getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Cursor cur = mAdapter.getCursor();
            cur.moveToPosition(position);
            String curName = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
            System.out.println(curName);
            uriContact = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
            Cursor cursorID = getContentResolver().query(uriContact,
                    null,
                    null, null, null);
            for (cursorID.moveToFirst(); !cursorID.isAfterLast(); cursorID.moveToNext() ) {
                String testName = cursorID.getString(cursorID.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
                if (testName != null && testName.equals(curName)) {
                    contactID = cursorID.getString(cursorID.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                }
            }
            if (contactID != null) {
                System.out.println(contactID);
                Toast.makeText(MainActivity.this, "contact Phone: " + contactID, Toast.LENGTH_LONG).show();
            }
        }
    });

编辑:我得到了一个更优化的版本,它使用查询中的选择和selectionArgs返回当前的联系人信息:

代码语言:javascript
复制
  getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Cursor cur = mAdapter.getCursor();
            cur.moveToPosition(position);
            String curName = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
            System.out.println(curName);
            uriContact = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
            Cursor cursorID = getContentResolver().query(uriContact,
                    null,
                    ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " = ?", new String[]{curName}, null);
            if (cursorID.moveToFirst()) {
                contactID = cursorID.getString(cursorID.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            }
            if (contactID != null) {
                System.out.println(contactID);
                Toast.makeText(MainActivity.this, "contact Phone: " + contactID, Toast.LENGTH_LONG).show();
            }
        }
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31422789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档