Android联系人电话号码使用加载程序无效列数据1

Android联系人电话号码使用加载程序无效列数据1,android,contacts,Android,Contacts,我以前使用内容解析器来获取联系人列表和他们的详细信息,但这仍然有效。我想尝试在后台查询内容提供者的加载程序方法。我在这里查看了文档和示例代码: 虽然我能够毫无问题地显示联系人列表,但我仍然无法通过单击某个联系人的电话号码并将其显示在详细信息屏幕上来检索该联系人的电话号码。上面的演示在详细信息屏幕上显示了用户的地址,我甚至尝试过修改它。我已将内容URI从Contacts更改为Contacts contract.CommonDataTypes.Phone,但我不断收到 java.lang.Ille

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

虽然我能够毫无问题地显示联系人列表,但我仍然无法通过单击某个联系人的电话号码并将其显示在详细信息屏幕上来检索该联系人的电话号码。上面的演示在详细信息屏幕上显示了用户的地址,我甚至尝试过修改它。我已将内容URI从Contacts更改为Contacts contract.CommonDataTypes.Phone,但我不断收到

java.lang.IllegalArgumentException: Invalid column data1
互联网上没有一个详细的教程来展示它是如何做到的。这里有人能帮我解释一下吗?阅读其他各种Stackoverflow问题,我敢肯定这和2个不同的内容URI有关,但我可能还是错了。任何帮助或指点都将不胜感激。谢谢

我已经研究过的几个问题:

没有一个能解决我的问题。以下是失败的相关代码:

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

代码运行得很好,但当我删除注释以获取电话号码时,它就失败了

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

以下是我的相关产品:

import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;
假设id是一个字符串(表示一个数字,如“1”、“20”…)


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

在我的例子中,问题在于URI

我用的是:

Uri uri = ContactsContract.Contacts.CONTENT_URI;
我更改了此(Phone.CONTENT\u 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");
        }
更改查询URI。 您使用的URI不用于搜索/筛选联系人上的列(例如电话号码):

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

Uri uri = ContactsContract.Data.CONTENT_URI;
或者这个,因为你正在搜索电话号码:

Uri uri = ContactsContract.PhoneLookup.CONTENT_FILTER_URI;
有一个关于使用什么URI以及何时使用URI的详细分类:

    >P>如果您需要读取单独的联系人,请考虑使用CordeToLoopUpURI代替Cordunthuri。

  • 如果需要通过电话号码查找联系人,请使用PhoneLookup.CONTENT\u FILTER\u URI,该URI为此目的进行了优化

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

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


卡萨里埃多谢谢你,这节省了我很多时间!
Uri uri = ContactsContract.PhoneLookup.CONTENT_FILTER_URI;