准备做个通话录音的东西,下面是异步查询通讯录的代码
private static final String TAG = "ContractChoseActivity";
private int sdkVersion = 4;
private String mColumnName = null;
private ListView mListView;
private MyAdapter mAdapter;
private ListQueryHandler mQueryHandler;
public void onCreate(Bundle bundle){
super.onCreate(bundle);
setContentView(R.layout.contract);
mListView = (ListView) this.findViewById(R.id.contract_list);
mQueryHandler = new ListQueryHandler(getContentResolver());
queryList(mQueryHandler);
}
private void queryList(AsyncQueryHandler async) {
if (async != null) {
try {
sdkVersion = Integer.parseInt(android.os.Build.VERSION.SDK.trim());
} catch (Exception e) {
sdkVersion = 3;
}
Uri personUri = null;
if(sdkVersion > 4){//2.x,sdk版本
personUri = Uri.parse("content://com.android.contacts/contacts");
mColumnName = "display_name";
}else{//1.6以下SDK
personUri = Contacts.People.CONTENT_URI;
mColumnName = Contacts.People.NAME;
}
//开始异步查询
async.startQuery(0, null, personUri, null, null, null, null);
}
}
class MyAdapter extends CursorAdapter {
private LayoutInflater mInflater;
public MyAdapter(Context context, Cursor c) {
super(context, c);
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getListLength() {
int ret = 0;
if (getCursor() != null)
ret = getCount();
return ret;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ItemStruct struct = (ItemStruct) view.getTag();
if(cursor != null){
try{
struct.name.setText(cursor.getString(cursor.getColumnIndex(mColumnName)));
// struct.number.setText(cursor.getString((cursor.getColumnIndex(Contacts.People.NUMBER))));
}catch(Exception ex){
Log.d(TAG, "exception>>"+ex.toString());
ex.printStackTrace();
}
}
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View convertView = null;
convertView = mInflater.inflate(R.layout.contract_row, parent, false);
ItemStruct struct = new ItemStruct();
struct.checkbox = (CheckBox) convertView.findViewById(R.id.contract_checkbox);
struct.name = (TextView) convertView.findViewById(R.id.contract_name);
struct.number = (TextView) convertView.findViewById(R.id.contract_number);
convertView.setTag(struct);
return convertView;
}
private class ItemStruct {
CheckBox checkbox;
TextView name;
TextView number;
}
}
class ListQueryHandler extends AsyncQueryHandler {
public ListQueryHandler(ContentResolver cr) {
super(cr);
}
/**
* 异步查询结束时
*/
public void onQueryComplete(int token, Object cookie, Cursor cursor) {
if (cursor != null) {
if (mAdapter == null) {
mAdapter = new MyAdapter(ContractChoseActivity.this, cursor);
mListView.setAdapter(mAdapter);
} else {
mAdapter.changeCursor(cursor);
}
}
}
}
本来打算连电话号码一起显示的,后来发现不在同一张表中,google的通讯录不是简单的电话本,这张表中只有个字段是has_phone_number,然后可以还需要继续跟进id去匹配查询另外一张表才可以得到全部的电话号码(1个人可以有多个号码)。下面的代码具体有方式:
参考:http://topic.youkuaiyun.com/u/20101124/12/45aa763f-82ed-4c23-9877-64d725c6aed9.html
1. Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
2. while (cursor.moveToNext())
3. {
4. String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
5. String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
6. if (Boolean.parseBoolean(hasPhone))
7. {
8. Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null);
9. while (phones.moveToNext())
10. {
11. String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
12. }
13. phones.close();
14. }
15. Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId,null, null);
16. while (emails.moveToNext())
17. {
18. String emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.CommonDataColumns.DATA));
19. }
20. emails.close();
21. }
22. cursor.close();
本文介绍了一种在Android应用中异步查询通讯录的方法,并提供了详细的代码实现。通过使用AsyncQueryHandler,文章展示了如何获取联系人姓名及电话号码等信息。
314

被折叠的 条评论
为什么被折叠?



