通过使用ContentResolver读取系统发布好的通讯录相关的数据库内容,并可以将里面的数据取得,列表显示。
public class MainActivity extends Activity {
private ListView list;
private ArrayAdapter<String> adapter;
private List<String> allValues = new ArrayList<String>();
private List<String> allPhoneNum = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Globals.init(this);
// 设置默认使用的布局文件
setContentView(R.layout.activity_main);
list = (ListView) findViewById(R.id.list);
// 使用ContentResolver读取通讯录中的所有数据
Cursor c = getContentResolver().query(Contacts.CONTENT_URI, null, null,
null, null);
c.moveToFirst();
while (!c.isAfterLast()) {
StringBuilder builder = new StringBuilder();
// 加入通讯录的姓名
builder.append(c.getString(c.getColumnIndex(Contacts.DISPLAY_NAME)));
// 取得通讯录中联系人的id
String contactId = c.getString(c.getColumnIndex(Contacts._ID));
// 加入电话的显示
// 需要关联查询出电话号码
Cursor c2 = getContentResolver()
.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, Phone.CONTACT_ID + " = ?",
new String[] { contactId }, null);
builder.append(" --> ");
// 随意记录一个电话,一边拨叫,这里记录循环中的最后一个电话
String number = "";
c2.moveToFirst();
while (!c2.isAfterLast()) {
builder.append(c2.getString(c2.getColumnIndex(Phone.NUMBER))
+ ",");
number = c2.getString(c2.getColumnIndex(Phone.NUMBER));
c2.moveToNext();
}
c2.close();
allPhoneNum.add(number);
allValues.add(builder.toString());
c.moveToNext();
}
c.close();
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, allValues);
list.setAdapter(adapter);
}
}
但还需要声明读取通讯录的权限
如果想加入拨打电话的功能,则需要提供一个打电话的权限
// 可以加入一个点某一项的监听
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// 将当前点击项对应的电话号码取得
String num = allPhoneNum.get(arg2);
// 切换到系统拨打电话的界面上
Intent in = new Intent();
// 设置要切换的系统动作
in.setAction(Intent.ACTION_CALL);
// 设置拨打电话的电话号码, 格式为: tel:电话
in.setData(Uri.parse("tel:" + num));
startActivity(in);
}
});
权限为:
如果想读取通话记录,则还要加入以下权限
public class MainActivity extends Activity {
private ListView list;
private ArrayAdapter<String> adapter;
private List<String> allValues = new ArrayList<String>();
private List<String> allPhoneNum = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Globals.init(this);
// 设置默认使用的布局文件
setContentView(R.layout.activity_main);
list = (ListView) findViewById(R.id.list);
// 使用ContentResolver读取通讯录中的所有数据
Cursor c = getContentResolver().query(CallLog.Calls.CONTENT_URI, null,
null, null, null);
c.moveToFirst();
while (!c.isAfterLast()) {
StringBuilder builder = new StringBuilder();
// 加入姓名
String name = c.getString(c
.getColumnIndex(CallLog.Calls.CACHED_NAME));
if (name == null || name.equals("")) {
name = "未知电话";
}
builder.append(name);
// 加入电话的显示
builder.append(" --> ");
// 随意记录一个电话,一边拨叫,这里记录循环中的最后一个电话
String number = c.getString(c.getColumnIndex(Calls.NUMBER));
builder.append(number);
builder.append(" --> ");
int type = c.getInt(c.getColumnIndex(Calls.TYPE));
if (type == Calls.INCOMING_TYPE) {
builder.append("已接电话");
} else if (type == Calls.MISSED_TYPE) {
builder.append("未接电话");
} else {
builder.append("拨出电话");
}
allPhoneNum.add(number);
allValues.add(builder.toString());
c.moveToNext();
}
c.close();
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, allValues);
list.setAdapter(adapter);
// 可以加入一个点某一项的监听
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// 将当前点击项对应的电话号码取得
String num = allPhoneNum.get(arg2);
// 切换到系统拨打电话的界面上
Intent in = new Intent();
// 设置要切换的系统动作
in.setAction(Intent.ACTION_CALL);
// 设置拨打电话的电话号码, 格式为: tel:电话
in.setData(Uri.parse("tel:" + num));
startActivity(in);
}
});
}
}