Android中实现显示手机联系人并调用

今天把昨天的学习内容进行了编码,在实现显示手机的联系人,点击返回联系人电话号码时出现了错误,代码谢了半个多小时,检查错误用了1个小时,但还好最后找到了错误的地方,现在记下来分享一下。

流程:点击选择联系人-->进入显示联系人的界面--->点击选中联系人--->在原来界面显示选中联系人的手机号。

public void selectContact(View view) {
		Intent intent = new Intent(SettingStep3.this, SelectContactActivity.class);
		startActivityForResult(intent, 0);
	}

在Button上加一个onClick标签,写上上面的方法名,点击时,调用这个方法,注意是startActivityForResult(),第一个参数是打开界面的意图,第二个是请求码,这样,如果过重写onActivityResult()时,就可以接收传过来的数据。


然后跳转到联系人界面,就是一个listView显示:

public class SelectContactActivity extends Activity {
	ListView list_select_contact;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_select_contact);
		list_select_contact = (ListView) findViewById(R.id.list_select_contact);
		
		final List<Map<String,String>> list = getContacts();	
		list_select_contact.setAdapter(new SimpleAdapter(this, list, R.layout.contact_item_view, new String[] {"name","phone"}, new int[] {R.id.tv_name,R.id.tv_phone}));
		list_select_contact.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				String phone = list.get(position).get("phone");
				Intent intent = new Intent();
				intent.putExtra("phone", phone);
				setResult(0, intent);
				finish();
			}
		});
	}
	
	private List<Map<String,String>> getContacts() {
		List<Map<String,String>> list_contact = new ArrayList<Map<String,String>>();
		
		ContentResolver resolver = getContentResolver();
		Uri idUri = Uri.parse("content://com.android.contacts/raw_contacts");
		Uri dataUri = Uri.parse("content://com.android.contacts/data");
		Cursor cursor = resolver.query(idUri, new String[] {"contact_id"}, null, null, null);
		while(cursor.moveToNext()) {
			String id = cursor.getString(0);
			Map<String,String> map = new HashMap<String,String>();
			if(id!=null) {
				Cursor dataCursor = resolver.query(dataUri, new String[] {"data1", "mimetype"}, "contact_id=?", new String[] {id}, null);
				while(dataCursor.moveToNext()) {
					String data1 = dataCursor.getString(0);
					String mimetype = dataCursor.getString(1);
					System.out.println("data1=="+data1+"==mimetype=="+mimetype);
					if("vnd.android.cursor.item/name".equals(mimetype)) {
						map.put("name", data1);
					} else if("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
						map.put("phone", data1);
					}
				}
				list_contact.add(map);
				dataCursor.close();
			}
		}
		cursor.close();
		return list_contact;
	}
}

给ListVIew设置一个适配器,然后设置点击事件,在点击时间里面要完成回传数据操作,这里传的事一个带数据的意图对象,用putExtra(key,value)保存数据,也就是手机号,然后用setRequest(0,intent),进行传递给原来界面,最后finish()掉现在的界面。

要注意的事获得联系人这个方法,联系人在手机里也是通过数据库存取的,要注意raw_contacts和data表,第一个表里记录了联系人信息的id,第二个里记录了名字和手机,以mimetype来区分,所以我们要先查询id,然后遍历id,通过id遍历data表获得每一个id获得名字和手机,保存到一个map中,最后map保存到list中,最后关闭cursor并传这个获得了数据的list。


然后在原来界面处理返回数据:

用getStringExtra(key)获得手机号,然后在对应位置显示出来。

//处理返回的数据
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if(data==null) {
			return;
		} else {
			String number = data.getStringExtra("phone");
			if(number==null) {
				System.out.println("null");
			}
			et_number.setText(number);
		}
	}


我出现的错误在两个地方:

1.因为要查询两个表,所以要两个cursor,一个idCursor,一个dataCursor,我用idCursor去获得mimetype了,应该用dataCursor才对,可能是当时不熟练理解错误导致。

2.往intent 里putExtra()时,应该是(“phone”,phone),我写成了(“name”,phone),导致key错误,所以在界面通过intent取值时,报了nullpointexception,这是不专心不熟练导致的错误。


另外,exlipse的logcat可能不出现信息,这时候过关关掉重新打开就ok,只有看到了错误信息才知道哪错了,才能调试的啊。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值