参考:Android 获取联系人和电话号码
android之选择联系人并返回电话号码
获取所有联系人的姓名、号码
权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>
代码:
/**
* android之获取所有联系人的姓名、号码
*/
public class ContactActivityI extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contacti);
String[] cols = {ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, cols, null, null, null);
if (cursor != null) {
int count = cursor.getCount();
for (int i = 0; i < count; i++) {
cursor.moveToPosition(i);
// 取得联系人名字
int nameFieldColumnIndex = cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME);
int numberFieldColumnIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
String name = cursor.getString(nameFieldColumnIndex);
String number = cursor.getString(numberFieldColumnIndex);
Log.e("111", "queryContactPhoneNumber: name==" + name + " number==" + number);
}
cursor.close();
}
}
}
选择联系人并返回电话号码
权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
代码:
/**
* http://blog.csdn.net/jason0539/article/details/21855825
* android之选择联系人并返回电话号码
*/
public class ContactActivity extends Activity {
private TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contact);
Button pick = (Button) findViewById(R.id.pick);
show = (TextView) findViewById(R.id.show);
pick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
ContactActivity.this.startActivityForResult(intent, 1);
}
});
}
@SuppressWarnings("deprecation")
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
Uri contactData = data.getData();
Cursor cursor = managedQuery(contactData, null, null, null, null);
cursor.moveToFirst();
String num = getContactPhone(cursor);
show.setText("所选手机号为:" + num);
//号码会有空格,如259 9281 7922
Log.e("333", "num==" + num);
String trim = num.trim();
Log.e("333", "trim==" + trim);
String replace = trim.replace(" ", "");
Log.e("333", "replace==" + replace);
}
break;
default:
break;
}
}
private String getContactPhone(Cursor cursor) {
int phoneColumn = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
int phoneNum = cursor.getInt(phoneColumn);
String result = "";
if (phoneNum > 0) {
// 获得联系人的ID号
int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
String contactId = cursor.getString(idColumn);
// 获得联系人电话的cursor
Cursor phoneCursor = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="
+ contactId, null, null);
if (phoneCursor != null && phoneCursor.moveToFirst()) {
for (; !phoneCursor.isAfterLast(); phoneCursor.moveToNext()) {
int index = phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
result = phoneCursor.getString(index);
}
if (!phoneCursor.isClosed()) {
phoneCursor.close();
}
}
}
return result;
}
}
activity_contact.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<TextView
android:id="@+id/show"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<Button
android:id="@+id/pick"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/show"
android:layout_below="@+id/show"
android:text="选择联系人" />
</RelativeLayout>
拨打电话:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);//ACTION_DIAL
intent.setData(Uri.parse("tel:"+"110"));
startActivity(intent);
权限:
<uses-permission android:name="android.permission.CALL_PHONE"/>
通讯录相关知识:
Android联系人数据库文件(contact2.db):
比较重要的几个表:
1、contacts表
_id :表的ID,主要用于其它表通过contacts 表中的ID可以查到相应的数据。
display_name: 联系人名称
photo_id:头像的ID,如果没有设置联系人头像,这个字段就为空
times_contacted:通话记录的次数
last_time_contacted: 最后的通话时间
lookup :是一个持久化的储存,因为用户可能会改名,但是它改不了lookup
该表保存了本机保存的所有联系人,每个联系人占一行,该表保存了联系人的ContactID、联系次数、最后一次联系的时间、是否含有号码、是否被添加到收藏夹等信息。
2、raw_contacts表
version :版本号,用于监听变化
deleted :删除标志, 0为默认 1 表示这行数据已经删除
display_name : 联系人名称
last_time_contacts : 最后联系的时间
该表保存了所有创建过的手机联系人,每个联系人占一行,表里有一列标识该联系人是否被删除,该表保存了两个ID: RawContactID和ContactID,从而将contacts表和raw_contacts表联系起来。该表保存了联系人的RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。
3、 mimetypes 表
该表定义了所有的MimeTypeID,即联系人的各个字段的唯一标志。
4、data表
该表保存了所有创建过的手机测联系人的所有信息,每个字段占一行 ,该表保存了两个ID: MimeTypeID和RawContactID,从而将data表和raw_contacts表联系起来。
联系人的所有信息保存在列data1至data15中,各列中保存的内容根据MimeTypeID的不同而不同。如保存号码(MimeTypeID=5)的那行数据中,data1列保存号码,data2列保存号码类型(手机号码/家庭号码/工作号码等)。
对联系人的基本操作(增删改查)权限设置:
<!-- 读联系人权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!-- 写联系人权限 -->
<uses-permissionandroid:name="android.permission.WRITE_CONTACTS" />
其他:
contacts表也就是联系人表的URI
scontent://com.android.contacts/contact
对应类静态常量为
ContactsContract.Contacts.CONTENT_URI
联系人电话URI
content://com.android.contacts/data/phones
对应静态常量为
ContactsContract.CommonDataKinds.Phone.CONTENT_URI
联系人邮箱URI
content://com.android.contacts/data/emails ,
对应静态常量为
ContactsContract.CommonDataKinds.Email.CONTENT_URI
联系人地址URI
content://com.android.contacts/data/postals ,
对应静态常量为
ContactsContract.CommonDataKinds.StructuredPostall.CONTENT_URI
所有联系人的Uri
content://contacts/people
某个联系人x的Url
content://contacts/people/x
data表URI
content://com.Android.contacts/data
对应静态常量为
ContactsContract.Data.CONTENT_URI
通过content://com.android.contacts/contacts ,你就可以查找contacts表
其中比较重要的字段有:
_id–>联系人的ID
通过content://com.android.contacts/data 你就可以查询data表
row_contact_id–>联系人的id地址
data1–>所存在联系人的名字、邮箱和出生地
data2–>指明数据的类型(一个int型,相当于mineetypes的id)。eg vnd.android.cursor.item/email_v2
minetypes–>指明具体的数据的类型
当你不知道你表中有多少数据的时候,最好就是通过cursor.getColumnnames()来打印你所有的列,然后去数据库中找寻相对应的值
而实际上,在你使用的过程中,你完全可以通过content://com.android.contacts/data来查询到所有的数据,
但是那样你就不好判断id,所以才会引用contacts的URI,用于id的分别,也好查询一个联系人。