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

时间:2014-02-16 13:30:51

标签: android contacts

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

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

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

java.lang.IllegalArgumentException: Invalid column data1

互联网上没有一个详细的教程显示它是如何完成的。这里有人能够善待一些光明吗?阅读各种其他Stackoverflow问题我很确定它与2个不同的CONTENT 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 个答案:

答案 0 :(得分:6)

就我而言,问题出在 URI 上。

我正在使用它:

Uri uri = ContactsContract.Contacts.CONTENT_URI;

我为此更改了( Phone.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");
        }

答案 1 :(得分:0)

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

这些是我的相关进口商品:

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
                )
            );
    }

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

答案 2 :(得分:0)

更改您的查询URI。

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

您需要使用可以访问您尝试过滤的列的URI,如下所示:

Uri uri = ContactsContract.Data.CONTENT_URI;

或者也许这是因为您正在搜索电话号码:

Uri uri = ContactsContract.PhoneLookup.CONTENT_FILTER_URI;

Android SDK Documentation上使用哪些URI以及何时正确分解:

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

  •   
  • 如果您需要通过电话号码查找联系人,请使用针对此目的进行优化的PhoneLookup.CONTENT_FILTER_URI。

  •   
  • 如果您需要按部分名称查找联系人,例如要生成按类型过滤的建议,请使用CONTENT_FILTER_URI URI。

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

  •   
相关问题