【问题标题】:Where is address field in android ContactsContractandroid ContactsContract中的地址字段在哪里
【发布时间】:2021-01-24 14:04:45
【问题描述】:

我正在尝试使用活动的内容解析器检索联系人的地址。任何地方都没有地址字段。我试过 ContactsContract.CommonDataKinds.StructuredPostal.STREET 但它也给了我不同的价值。请查看我正在尝试检索的 android 中该字段的屏幕截图。

在下面的代码中,我正在遍历 CONTENT_URI 中“John Doe”的所有值,但是这个地址“Slaughter Lane”从未出现,即我在 Timber 日志命令“找到地址”处的断点从未出现命中。

fun getContact(activity: FragmentActivity, name: String): Contact? {
    var contact = Contact()
    val cr : ContentResolver = activity.contentResolver
    var selectionArgs: Array<String> = arrayOf("John Doe")
    val cursor = cr.query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        null,
        "DISPLAY_NAME = ?",
        selectionArgs,
        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"
    )
    if (cursor != null) {
        try {
            while (cursor.moveToNext()) {
                cursor.columnNames.forEach {
                    var stringValue: String? = cursor.getString(cursor.getColumnIndex(it))
                    if (stringValue!=null) {
                        if (stringValue.contains("Slaughter")){
                            Timber.i("Found the address");
                        }
                    }
                }
            }
        } finally {
            cursor.close()
        }
    }
    return if (contact.name != null) contact else null
}

【问题讨论】:

  • 请发布您的代码,您可能查询了错误的 CONTENT_URI
  • 代码..当然!!忘了那个。现在添加,谢谢

标签: android kotlin android-contacts


【解决方案1】:
fun getAddress(rawContactId: Long): String? {
        val contentResolver = context.contentResolver
        val projection: Array<out String> = arrayOf(
            ContactsContract.Data.CONTACT_ID,
            ContactsContract.Data.MIMETYPE,
            ContactsContract.Data.DATA1,
            ContactsContract.Data.DATA2,
        )
        val selection = "${ContactsContract.Data.CONTACT_ID} = ?"
        val selectionArgs: Array<String> = arrayOf("")
        selectionArgs[0] = rawContactId.toString()
        val cursor = contentResolver.query(
            ContactsContract.Data.CONTENT_URI,
            projection,
            selection,
            selectionArgs,
            null
        )
        var address: String? = null

        cursor?.apply {
            while (moveToNext()) {
                if (rawContactId == getLong(getColumnIndex(ContactsContract.Data.CONTACT_ID))) {
                    val mimeType: String = getString(getColumnIndex(ContactsContract.Data.MIMETYPE))
                    if (mimeType == ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)
                        address = getString(getColumnIndex(ContactsContract.Data.DATA1))

                }
            }
        }
        cursor?.close()

        return address
    }

【讨论】:

    【解决方案2】:

    您发布的代码未显示您尝试访问StructuredPostal.STREET 的方式,但我想我理解您是如何尝试访问的。

    当您查询 Phone.CONTENT_URI 时,您只会收到一般联系信息(例如 Data.CONTACT_ID 和 Data.DISPLAY_NAME)以及电话特定列(例如 Phone.NUMBER),因为每一行都是 mimetype Phone.CONTENT_ITEM_TYPE .

    您无法从该查询中获取地址信息。

    如果您需要多种类型的信息(例如电话和地址),则需要查询更通用的Data.CONTENT_URI uri,然后使用Data.MIMETYPE 找出这是什么类型的行,电话,地址,或其他...您可以通过在Data.MIMETYPE 上添加选择来限制收到的行的类型

    这里是示例代码(在 java 中):

    String[] projection = {Data.CONTACT_ID, Data.DISPLAY_NAME, Data.MIMETYPE, Data.DATA1, Data.DATA2, Data.DATA3};
    
    // query only phones and addresses
    String selection = Data.MIMETYPE + " IN ('" + Phone.CONTENT_ITEM_TYPE + "', '" + StructuredPostal.CONTENT_ITEM_TYPE + "')";
    ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(Data.CONTENT_URI, projection, selection, null, null);
    
    while (cur != null && cur.moveToNext()) {
        long id = cur.getLong(0);
        String name = cur.getString(1); // full name
        String mime = cur.getString(2); // type of data (phone / address)
        String data = cur.getString(3); // the actual info, e.g. +1-212-555-1234
    
        String kind = "unknown";
    
        switch (mime) {
            case Phone.CONTENT_ITEM_TYPE: 
                kind = "phone"; 
                break;
            case StructuredPostal.CONTENT_ITEM_TYPE: 
                kind = "address";
                break;
        }
        Log.d(TAG, "got " + id + ", " + name + ", " + kind + " - " + data);
    }
    cur.close();
    

    您可能会获得同一个联系人的多个电话和地址,因此如果您需要每个联系人,您应该将来自 id 的 HashMap 添加到您需要的数据中。

    【讨论】:

      猜你喜欢
      • 2014-08-20
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      相关资源
      最近更新 更多