使用 Android 上的 ContactsContract api 从联系人获取邮政地址
Posted
技术标签:
【中文标题】使用 Android 上的 ContactsContract api 从联系人获取邮政地址【英文标题】:Get Postal address from a contact using ContactsContract api on android 【发布时间】:2011-04-06 07:11:18 【问题描述】:我正在使用 ContactsContract api 意图来显示活动中的所有联系人。此意图返回联系人的 id。我需要得到这个联系人的邮寄地址。
这是我用来显示联系人的代码:
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
startActivityForResult(intent, PICK_CONTACT);
我在onActivityResult
函数中得到结果。
请帮忙,我该怎么做。
【问题讨论】:
【参考方案1】:在您的 onActivityResult 中,首先获取联系人 ID 并在 ContactsContract.Data 中查询相关数据:
// get the contact ID
Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null);
cursor.moveToFirst();
long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.Contacts._ID));
cursor.close();
// get the data package containg the postal information for the contact
cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI,
new String[] StructuredPostal.STREET,
StructuredPostal.CITY,
// add more coluns from StructuredPostal if you need them
StructuredPostal.POSTCODE,
ContactsContract.Data.CONTACT_ID + "=? AND " +
StructuredPostal.MIMETYPE + "=?",
new String[]String.valueOf(id), StructuredPostal.CONTENT_ITEM_TYPE,
null);
Street = cursor.getString(cursor.getColumnIndex(StructuredPostal.STREET));
Postcode = cursor.getString(cursor.getColumnIndex(StructuredPostal.POSTCODE));
City = cursor.getString(cursor.getColumnIndex(StructuredPostal.CITY)));
// etc.
【讨论】:
【参考方案2】:也可以这样做(代码少一点)
以这种方式发送 Intent:
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_TYPE);
startActivityForResult(intent, PICK_CONTACT);
在 onActivityResult 方法中
Uri contactData = data.getData();
Cursor c = managedQuery(contactData, null, null, null, null);
if (c.moveToFirst())
String address = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS));
【讨论】:
【参考方案3】:Kiran 的回答可能适用于 android 2.0 及更高版本,但当您希望它与 Android 1.6 及更低版本兼容时,您需要稍微调整代码:
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(Contacts.ContactMethods.CONTENT_POSTAL_TYPE);
startActivityForResult(intent, PICK_CONTACT);
并且在 onActivtyResult 方法中:
Uri contactData = data.getData();
Cursor c = managedQuery(contactData, null, null, null, null);
if (c.moveToFirst())
String address = c.getString(c.getColumnIndexOrThrow(Contacts.ContactMethodsColumns.DATA));
其中PICK_CONTACT
是您自己选择的int
。 (对吧?)
【讨论】:
【参考方案4】:这将返回联系人邮政地址中的所有地址。
Uri uri = ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI;
String sortOrder = StructuredPostal.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
Cursor cr = getContentResolver().query(uri,null, null, null, sortOrder);
while(cr.moveToNext())
String Street = cr.getString(cr.getColumnIndex(StructuredPostal.STREET));
String Postcode = cr.getString(cr.getColumnIndex(StructuredPostal.POSTCODE));
String City = cr.getString(cr.getColumnIndex(StructuredPostal.CITY));
Toast.makeText(this,"Address is : " +City+","+Street ,Toast.LENGTH_SHORT).show();
cr.close();
【讨论】:
以上是关于使用 Android 上的 ContactsContract api 从联系人获取邮政地址的主要内容,如果未能解决你的问题,请参考以下文章
android中RawContacts.CONTENT_URI和ContactsContract.Contacts.CONTENT_URI的区别
Android 上的 WebSockets 与 Android 中的 socket.io