ContentProvider读取通讯录和通话记录

通过使用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);
			}
		});
	}
}























  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值