今天把昨天的学习内容进行了编码,在实现显示手机的联系人,点击返回联系人电话号码时出现了错误,代码谢了半个多小时,检查错误用了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,只有看到了错误信息才知道哪错了,才能调试的啊。。