在android中使用内容提供者获取联系号码
Posted
技术标签:
【中文标题】在android中使用内容提供者获取联系号码【英文标题】:Getting contact number using content provider in android 【发布时间】:2012-04-03 16:59:09 【问题描述】:我按照本教程学习了 Content Providers 的基础知识:http://www.vogella.de/articles/androidSQLite/article.html
但我想知道如何获取针对显示名称存储的联系号码。尝试使用“ContactsContract.Contacts.CONTENT_VCARD_TYPE”。但是遇到了错误。
如果有任何解决方案,请告诉我。
谢谢 斯内哈
【问题讨论】:
您遇到的错误是什么? 这里:***.com/questions/9496350/… 谢谢 KKD.. 但你能解释一下吗:光标电话 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = " + id,null,null);以及我们如何知道“ cNumber =phones.getString(phones.getColumnIndex("data1")); ”中的列名是“data1” 【参考方案1】:这是一个关于在android中使用内容提供者获取联系号码的好教程
http://www.higherpass.com/Android/Tutorials/Working-With-Android-Contacts/
和
http://www.app-solut.com/blog/2012/06/retrieval-of-contacts-with-contact-contract/
并且可以像这样选择联系电话
添加按钮点击事件
button1.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
// TODO Auto-generated method stub
i = new Intent(Intent.ACTION_PICK,
ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(i, PICK_CONTACT);
);
//outside button click
public void onActivityResult(int reqCode, int resultCode, Intent data)
super.onActivityResult(reqCode, resultCode, data);
switch (reqCode)
case (PICK_CONTACT):
if (resultCode == Activity.RESULT_OK)
getContactInfo(data);
// onActivityResult
private void getContactInfo(Intent data)
// TODO Auto-generated method stub
ContentResolver cr = getContentResolver();
Cursor cursor = managedQuery(data.getData(), null, null, null, null);
while (cursor.moveToNext())
String contactId = cursor.getString(cursor
.getColumnIndex(ContactsContract.Contacts._ID));
Name = cursor
.getString(cursor
.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
String hasPhone = cursor
.getString(cursor
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
Cursor emailCur = cr.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
new String[]contactId, null);
emailCur.close();
if (hasPhone.equalsIgnoreCase("1"))
hasPhone = "true";
else
hasPhone = "false";
if (Boolean.parseBoolean(hasPhone))
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = " + contactId, null, null);
while (phones.moveToNext())
phoneNo = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
phones.close();
pname.setText(Name);
//
phno.setText(phoneNo);
Toast.makeText(this, Name + " " + phoneNo, Toast.LENGTH_SHORT).show();
【讨论】:
【参考方案2】:此代码适用于手机号码联系人,不适用于电子邮件或其他内容。我发现这段代码最简单。如果有任何问题,请告诉我。
以选择手机数据类型的意图开始活动:
findViewById(R.id.choose_contact_button).setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent pickContact = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
startActivityForResult(pickContact, PICK_CONTACT_REQUEST);
);
现在设置 onAcitivityResult();
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent)
switch (requestCode)
case PICK_CONTACT_REQUEST:
if (resultCode == RESULT_OK)
Uri contactUri = intent.getData();
Cursor nameCursor = getContentResolver().query(contactUri, null, null, null, null);
if (nameCursor.moveToFirst())
String name = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
((EditText)findViewById(R.id.person_name)).setText(name);
((EditText)findViewById(R.id.enter_mobile)).setText(number);
nameCursor.close();
break;
【讨论】:
以上是关于在android中使用内容提供者获取联系号码的主要内容,如果未能解决你的问题,请参考以下文章
阅读联系人时如何在android内容提供商中匹配DISPLAY NAME和Phone.NUMBER
从内容提供者那里获取联系人,没有重复或无效的联系人,并保存到 Realm