使用 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 上的文件名中允许使用哪些字符?

Android 上的 WebSockets 与 Android 中的 socket.io

蓝牙与 Android 上的 Qt。通过抽象类上的jni调用java类

使用房间连接到 Android 上的数据库

Android上的人脸识别