繁体   English   中英

Android从联系人列表中获取电话号码

[英]Android get phone number from contact list

我有这些代码,它们基本上使用ListView在联系人列表中显示姓名,并且我想在单击每个名称时获取其电话号码:

final ContentResolver cr = getContentResolver();

final Cursor c = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
myCursorAdapter = new SimpleCursorAdapter(this, R.layout.list_item, c, new String[] {ContactsContract.Contacts.DISPLAY_NAME}, new int[]{R.id.TVRow}, 0);
myPhoneList.setAdapter(myCursorAdapter);

myPhoneList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id){
        c.moveToPosition(position);
        Toast.makeText(getApplicationContext(), c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)), Toast.LENGTH_SHORT).show();
    }
});

onItemClick方法中

    GetColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)

返回-1,因此我无法使用此方法获取电话号码。

我还尝试打印出光标c所有列,它返回34列,但是似乎与电话号码相关的唯一列是HasPhoneNumber

那么问题出在哪里,我该如何解决? 谢谢!


更新版本,更改了传递给构造myCursorAdapterString数组的位置:

final ContentResolver cr = getContentResolver();

    final Cursor c = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    myCursorAdapter = new SimpleCursorAdapter(this, R.layout.list_item, c, new String[] {ContactsContract.CommonDataKinds.Phone.NUMBER}, new int[]{R.id.TVRow}, 0);
    myPhoneList.setAdapter(myCursorAdapter);

    myPhoneList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id){
            c.moveToPosition(position);
            Toast.makeText(getApplicationContext(), c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)), Toast.LENGTH_SHORT).show();
        }
    });

我想更新后的代码将在ListView中显示电话号码,但是我收到一条错误消息,说“列'data1'不存在”。

您可以使用以下代码在Recyclerview中获取联系人列表。

  List<ContactVO> contactVOList = new ArrayList();

  String[] projection = new String[]{ContactsContract.Contacts._ID, ContactsContract.Data.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.PHOTO_URI};
    Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null,
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
    List<ContactVO> userList = new ArrayList<>();

    String lastPhoneName = " ";
    if (phones.getCount() > 0) {
        while (phones.moveToNext()) {
            String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            String contactId = phones.getString(phones.getColumnIndex(ContactsContract.Contacts._ID));
            String photoUri = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
            if (!name.equalsIgnoreCase(lastPhoneName)) {
                lastPhoneName = name;
                ContactVO user = new ContactVO();
                user.setContactName(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
                user.setContactNumber(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
                userList.add(user);
                Log.d("getContactsList", name + "---" + phoneNumber + " -- " + contactId + " -- " + photoUri);
            }
        }
    }
    phones.close();

    AllContactsAdapter contactAdapter = new AllContactsAdapter(userList, getApplicationContext());
    rvContacts.setLayoutManager(new LinearLayoutManager(PhoneDirectoryActivity.this));
    rvContacts.setAdapter(contactAdapter);

ContactVO类文件下面;

public class ContactVO
{
private String ContactImage;
private String ContactName;
private String ContactNumber;

public String getContactImage() {
    return ContactImage;
}

public void setContactImage(String contactImage) {
    this.ContactImage = ContactImage;
}

public String getContactName() {
    return ContactName;
}

public void setContactName(String contactName) {
    ContactName = contactName;
}

public String getContactNumber() {
    return ContactNumber;
}

public void setContactNumber(String contactNumber) {
    ContactNumber = contactNumber;
}
}

以下是AllContactsAdapter文件

    public class AllContactsAdapter extends RecyclerView.Adapter<AllContactsAdapter.ContactViewHolder> {

    private List<ContactVO> contactVOList;
    private Context mContext;
    private SparseBooleanArray itemStateArray = new SparseBooleanArray();

    public AllContactsAdapter(List<ContactVO> contactVOList, Context mContext) {
        this.contactVOList = contactVOList;
        this.mContext = mContext;
    }

    @Override
    public ContactViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.single_contact_view, null);
        ContactViewHolder contactViewHolder = new ContactViewHolder(view);
        return contactViewHolder;
    }

    @Override
    public void onBindViewHolder(ContactViewHolder holder, int position) {
        ContactVO contactVO = contactVOList.get(position);
        holder.tvContactName.setText(contactVO.getContactName());
        holder.tvPhoneNumber.setText(contactVO.getContactNumber());

        holder.bind(position);

        holder.cbContact.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int adapterPosition = position;
                if (!itemStateArray.get(adapterPosition, false)) {
                    holder.cbContact.setChecked(true);
                    contactsList.add(holder.tvPhoneNumber.getText().toString());
                    itemStateArray.put(adapterPosition, true);
                } else {
                    holder.cbContact.setChecked(false);
                    itemStateArray.put(adapterPosition, false);
                    contactsList.remove(holder.tvPhoneNumber.getText().toString());
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return contactVOList.size();
    }

    public class ContactViewHolder extends RecyclerView.ViewHolder {

        ImageView ivContactImage;
        TextView tvContactName;
        TextView tvPhoneNumber;
        CheckBox cbContact;

        public ContactViewHolder(View itemView) {
            super(itemView);
            ivContactImage = itemView.findViewById(R.id.ivContactImage);
            tvContactName = itemView.findViewById(R.id.tvContactName);
            tvPhoneNumber = itemView.findViewById(R.id.tvPhoneNumber);
            cbContact = itemView.findViewById(R.id.cbContact);
        }
        void bind(int arg1) {
            // use the sparse boolean array to check
            if (!itemStateArray.get(arg1, false)) {
                cbContact.setChecked(false);
            } else {
                cbContact.setChecked(true);
            }
        }
    }
}

首先,在AndroidManifest.xml中添加此行以获取用户权限。

<uses-permission android:name="android.permission.READ_CONTACTS"/>

实现联系按钮

        phoneContactsButtton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
            // The below two line is needed to open the contact list of  mobile
                Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
                startActivityForResult(contactPickerIntent,1);

            }
        });

您必须重写onActivityResult(),该方法将类似于以下内容写入onCreate()方法的外部

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


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode){
        case 1 :
            if (resultCode == Activity.RESULT_OK) {
                Uri contactData = data.getData();

                Cursor cur =  getContentResolver().query(contactData, null, null, null, null);
                if (cur.getCount() > 0) {// thats mean some resutl has been found
                    if(cur.moveToNext()) {
                        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                        String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                        Log.e("Names", name);

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

                            Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ id,null, null);
                            while (phones.moveToNext()) {
                                String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                                Log.e("Number", phoneNumber);
                            }
                            phones.close();
                        }

                    }
                }
                cur.close();
            }
            break;
    }

}

ContactsContract Android API将有关联系人的Data例如电话号码)存储在Data表中,而不是Contacts表中。

请仔细阅读以下内容: https : //developer.android.com/reference/android/provider/ContactsContract.html

更新 -这是您代码的固定版本(未经测试):

final ContentResolver cr = getContentResolver();
String[] projection = new String[] {Contacts.DISPLAY_NAME, Phone.NUMBER};
final Cursor c = cr.query(Data.CONTENT_URI, projection, null, null, null);
myCursorAdapter = new SimpleCursorAdapter(this, R.layout.list_item, c, new String[] {Phone.NUMBER}, new int[]{R.id.TVRow}, 0);
myPhoneList.setAdapter(myCursorAdapter);

myPhoneList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id){
        c.moveToPosition(position);
        Toast.makeText(getApplicationContext(), c.getString(1), Toast.LENGTH_SHORT).show();
    }
});

它返回-1,因为您不从数据库请求列ContactsContract.CommonDataKinds.Phone.NUMBER

new String[] {ContactsContract.Contacts.DISPLAY_NAME}

ContactsContract.Contacts.DISPLAY_NAME是您要求的唯一字段。

为了获得电话号码,您首先需要将其包括在要从数据库中获取的列的列表中:

新的String [] {ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER}

现在,您必须重写适配器的getView以便将名称设置为列表行的textView。 之后,您的onItemClick将按预期工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM