代码之家  ›  专栏  ›  技术社区  ›  Adnan Mulla

使用Loader的Android联系人电话号码无效列数据1

  •  4
  • Adnan Mulla  · 技术社区  · 10 年前

    我以前经常使用内容解析器来获取联系人列表及其详细信息,但这仍然有效。我想尝试在后台查询内容提供商的Loader方法。我在这里查看了文档和示例代码:

    http://developer.android.com/training/contacts-provider/retrieve-details.html

    虽然我能够毫无问题地显示联系人列表,但我仍然无法通过点击特定联系人的电话号码并在详细屏幕上显示。上面的演示在详细屏幕上显示了用户的地址,我甚至尝试过修改它。我已经将内容URI从Contacts更改为ContactsContract.CommonDataKinds.Phone,但我一直在

    java.lang.IllegalArgumentException: Invalid column data1
    

    互联网上没有一个详细的教程显示它是如何完成的。这里有人能帮帮忙吗?阅读了其他各种Stackoverflow问题,我很确定这与两个不同的内容URI有关,但我可能又错了。任何帮助或指示都将非常感谢。谢谢

    我已经看过的SO问题很少:

    Get phone number from contact loader in android: projection crash

    Logcat says "invalid column data1"

    How to get contacts' phone number in Android

    Obtaining phone number from lookup URI

    他们都没有解决我的问题。以下是失败的相关代码:

         final static String[] PROJECTION = {
                Contacts._ID,
                Utils.hasHoneycomb() ? ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY : ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
               //ContactsContract.CommonDataKinds.Phone.NUMBER,
        };
    

    代码工作正常,但当我删除注释以获取电话号码时,它失败了

    3 回复  |  直到 7 年前
        1
  •  9
  •   Jorge Casariego    9 年前

    在我的情况下,问题是 乌里 .

    我在用这个:

    Uri uri = ContactsContract.Contacts.CONTENT_URI;
    

    我换了这个( 电话.CONTENT_URI )要解决问题并获取电话号码:

    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    

    这是代码的其余部分:

    contactos = (TextView) findViewById(R.id.contactos);
    
    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    
    String [] projection = new String[] {
                    ContactsContract.Contacts._ID,
                    ContactsContract.Contacts.DISPLAY_NAME,
                    ContactsContract.CommonDataKinds.Phone.NUMBER
            };
    
    Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
    
    while (cursor.moveToNext()){
                String nombre = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
                String telefono = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                contactos.append("Name: ");
                contactos.append(nombre);
                contactos.append(" - Phone Number: ");
                contactos.append(telefono);
                contactos.append("\n");
            }
    
        2
  •  1
  •   Community Ian Goodfellow    4 年前

    更改查询URI。

    您使用的URI不用于搜索/过滤联系人上的这些列(例如电话号码):

    您需要使用一个可以访问您要筛选的列的URI,如下所示:

    Uri uri = ContactsContract.Data.CONTENT_URI;
    

    或者是这个,因为你在搜索电话号码:

    Uri uri = ContactsContract.PhoneLookup.CONTENT_FILTER_URI;
    

    使用什么URI以及何时打开 Android SDK Documentation :

    • 如果您需要阅读单个联系人,请考虑使用CONTENT_LOOKUP_URI而不是CONTENT_URI。

    • 如果您需要按电话号码查找联系人,请使用PhoneLookup.CONTENT_FILTER_URI,该功能已为此进行了优化。

    • 如果您需要按部分名称查找联系人,例如在键入建议时生成筛选器,请使用CONTENT_filter_URI URI。

    • 如果需要通过电子邮件地址、昵称等数据元素查找联系人,请对ContactsContract.data表使用查询。结果将包含联系人ID、姓名等。

        3
  •  0
  •   Phantômaxx    10 年前

    这是我在(工作)代码中实际执行的操作的摘录。

    这些是我的相关进口:

    import android.provider.ContactsContract;
    import android.provider.ContactsContract.CommonDataKinds.Email;
    import android.provider.ContactsContract.CommonDataKinds.Phone;
    import android.provider.ContactsContract.Contacts;
    

    给定id是一个字符串(表示一个数字,如“1”、“20”…)

    // Query for phone numbers for the selected contact id
    final Cursor cur = getContentResolver().query
        (
        Phone.CONTENT_URI, null,
        Phone.CONTACT_ID + "=?",
        new String[] {id}, null
        );
    
    final int phoneIdx = cur.getColumnIndex(Phone.NUMBER);
    final int phoneType = cur.getColumnIndex(Phone.TYPE);
    
    // ...
    
        if(cur.moveToFirst())
        {
            final String name =
                cur.getString
                (
                    cur.getColumnIndexOrThrow
                    (
                        ContactsContract.Contacts.DISPLAY_NAME
                    )
                );
        }
    

    希望它能让你走上正确的道路