在Android中获取并选择联系人

用户名

我正在尝试获取所有联系人并选择它。

我已完成手机中所有联系人的获取。但是,当我尝试选择一些联系人并获取其姓名或电话号码时,我遇到了nullpointer错误。

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。

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

丹尼尔·纽金特(Daniel Nugent)

主要问题是uriContact查询时为null。

另一个问题是您仅将其ContactsContract.Contacts._ID用作投影,因此ID是唯一返回的东西。

我通过将其null用于投影来使其工作,以便它返回所有行。

我还添加了功能来查找当前选定的联系人,并显示带有其电话号码的Toast。

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

  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();
            }
        }
    });

编辑:我有一个更优化的版本工作,它使用查询中的selection和selectionArgs仅返回当前的联系信息:

  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();
            }
        }
    });

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

搜索联系人并从android中的电话联系人获取联系人号码

来自分类Dev

如何从Android中的联系人列表中获取联系人号码?

来自分类Dev

从Android中的“联系人”列表中获取联系人

来自分类Dev

Android:未从联系人列表中获取任何联系人

来自分类Dev

从ListView中选择联系人,并在Android中获取他们的电话号码

来自分类Dev

从ListView中选择联系人,并在Android中获取他们的电话号码

来自分类Dev

从Android 6.0中的“联系人”中选择联系人后,应用程序崩溃了

来自分类Dev

从android中的联系人获取地址详细信息

来自分类Dev

保存Android联系人后获取联系人ID

来自分类Dev

保存Android联系人后获取联系人ID

来自分类Dev

如何从 Android 联系人中的联系人 ID 中获取只读帐户名称

来自分类Dev

Android - 选择多个联系人

来自分类Dev

在iOS 7中获取联系人

来自分类Dev

Android中的智能搜索联系人

来自分类Dev

在Android中呼叫联系人

来自分类Dev

Android Editext从联系人列表中选择多个联系人

来自分类Dev

Android获取没有SIM卡联系人的联系人列表

来自分类Dev

Android仅从联系人ID获取联系人姓名

来自分类Dev

Android仅从联系人ID获取联系人姓名

来自分类Dev

联系人选择器中获取的联系号码不正确 - Android

来自分类Dev

Google Contacts Api获取特定组中的联系人。(我的联系人组)

来自分类Dev

如何从Android中的联系人列表中删除重复的联系人

来自分类Dev

从联系人列表中选择姓名,并在android中以编辑文本显示

来自分类Dev

如何在android中启动目录联系人的联系人详细信息活动

来自分类Dev

Android:-选择联系人并拨打选定的电话

来自分类Dev

如何从联系人获取联系人图像URL?

来自分类Dev

如何从联系人获取联系人图像URL?

来自分类Dev

在Android设备中的“联系人”>“设置”中获取排序顺序首选项选择的用户,以及如何减少查询时间?

来自分类Dev

如何获取自定义帐户类型以显示在android联系人应用中?

Related 相关文章

  1. 1

    搜索联系人并从android中的电话联系人获取联系人号码

  2. 2

    如何从Android中的联系人列表中获取联系人号码?

  3. 3

    从Android中的“联系人”列表中获取联系人

  4. 4

    Android:未从联系人列表中获取任何联系人

  5. 5

    从ListView中选择联系人,并在Android中获取他们的电话号码

  6. 6

    从ListView中选择联系人,并在Android中获取他们的电话号码

  7. 7

    从Android 6.0中的“联系人”中选择联系人后,应用程序崩溃了

  8. 8

    从android中的联系人获取地址详细信息

  9. 9

    保存Android联系人后获取联系人ID

  10. 10

    保存Android联系人后获取联系人ID

  11. 11

    如何从 Android 联系人中的联系人 ID 中获取只读帐户名称

  12. 12

    Android - 选择多个联系人

  13. 13

    在iOS 7中获取联系人

  14. 14

    Android中的智能搜索联系人

  15. 15

    在Android中呼叫联系人

  16. 16

    Android Editext从联系人列表中选择多个联系人

  17. 17

    Android获取没有SIM卡联系人的联系人列表

  18. 18

    Android仅从联系人ID获取联系人姓名

  19. 19

    Android仅从联系人ID获取联系人姓名

  20. 20

    联系人选择器中获取的联系号码不正确 - Android

  21. 21

    Google Contacts Api获取特定组中的联系人。(我的联系人组)

  22. 22

    如何从Android中的联系人列表中删除重复的联系人

  23. 23

    从联系人列表中选择姓名,并在android中以编辑文本显示

  24. 24

    如何在android中启动目录联系人的联系人详细信息活动

  25. 25

    Android:-选择联系人并拨打选定的电话

  26. 26

    如何从联系人获取联系人图像URL?

  27. 27

    如何从联系人获取联系人图像URL?

  28. 28

    在Android设备中的“联系人”>“设置”中获取排序顺序首选项选择的用户,以及如何减少查询时间?

  29. 29

    如何获取自定义帐户类型以显示在android联系人应用中?

热门标签

归档