【问题标题】:Cant get contacts given name and family name on ICS无法在 ICS 上获取联系人的名字和姓氏
【发布时间】:2013-01-20 20:26:41
【问题描述】:

我有这个代码来获取联系人的名字和姓氏:

                uri = ContactsContract.Data.CONTENT_URI;
                Cursor curName = getContentResolver().query(uri, null, ContactsContract.Data.CONTACT_ID +" = "+ contactId, null, null);
                if (curName.getCount() > 0){
                    curName.moveToFirst();
                    String nameGiven = curName.getString(curName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
                    String nameFamily = curName.getString(curName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
                    log += nameGiven + ", " + nameFamily + ": ";
                }

我只有一个联系人,所以我不需要循环。 在 2.3.5 设备上它工作正常,返回正确的名称。但在 4.0.4 设备上,这两个字段都返回 null,但如果请求显示名称,它会正确提供。

可能是什么问题?

【问题讨论】:

  • 您是否测试过打印所有内容?其他设备可能将数据保存在错误的位置。或者尝试使用 RawContacts。遗憾的是,每种设备处理联系人的方式存在许多差异。
  • 我已尝试打印所有表格,所有数据# 均为空。我会尝试使用 RawContacts。

标签: android android-contacts


【解决方案1】:

好吧,数据表和联系人表中的_ID是两个不同的东西。那么你 查询数据表时应使用 raw_contacts_id 而不是 _id

让我快速输入一段代码来帮助您入门

// projection
String[] projection = new String[] {ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME};

String where = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
String[] whereParameters = new String[]{this.contact_id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE};

//Request
Cursor contacts = this.resolver.query(ContactsContract.Data.CONTENT_URI, projection, where, whereParameters, null);

//Iteration
if (contacts.moveToFirst()) { 
    //code here, E.g
                String nameGiven = contacts.getString(contacts.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
                String nameFamily = contacts.getString(contacts.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));

                //log += nameGiven + ", " + nameFamily + ": "; 

} 
contacts.close();

【讨论】:

  • 我被重新分配了,还不能检查这个,我会尽快回到这个任务。
【解决方案2】:

您好,我认为光标查询需要修复,我通常这样使用

Cursor c = getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.CONTACT_ID + " = ?", new String[] {String.valueOf(contactId)}, null);
if (c.moveToFirst()){
    // get your code to get content on that cursor ex: c.getString(0)
}

请查看link 希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 2011-05-17
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多