通过 ID 获取联系电话号码 - 空光标

Posted

技术标签:

【中文标题】通过 ID 获取联系电话号码 - 空光标【英文标题】:Get contact phone number by ID - empty Cursor 【发布时间】:2014-11-11 08:19:23 【问题描述】:

所以我无法使用其 ID 获取联系人的电话号码。

这是我用来检索号码的代码:

public String getNumber()
        //gets numbers by id
        if (hasPhoneNumber)

            ContentResolver contentResolver=context.getContentResolver();
            Cursor cursor=contentResolver.query(
                    ContactsContract.Contacts.CONTENT_URI,
                    null,
                    ContactsContract.Contacts._ID+" = "+id,
                    null,
                    null
            ); //TODO : resolve empty cursor error
            //contact seems to have no data available?

            if (cursor.moveToFirst())

                cursor.moveToNext();

                String contactId=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

                Cursor phones=contentResolver.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID+" = "+contactId,
                        null,
                        null);

                if (phones.moveToFirst())
                    while (phones.moveToNext()) 
                        this.number=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    
                

                phones.close();
             else 
                test("cursor error...");
            

            cursor.close();

            return number;
         else 
            return null;
        
    

它适用于少数联系人,但大多数显示“光标错误...” Toast (test("cursor error..."))

总是这样

光标光标

有错误。

我猜它是空的,但我知道我已经保存了这些联系人的电话号码。我该如何解决?我还需要其他值吗?

提前致谢!

编辑:

这就是我检索 ID 和姓名的方式:

contactCursor=getActivity().getContentResolver().query(
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                new String[]
                        ContactsContract.Contacts._ID,//0 - Long
                        ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,//1 - String
                        ContactsContract.Contacts.HAS_PHONE_NUMBER,//2 - Integer
                ,
                null,
                null,
                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" ASC");

编辑 2:

我在 github 存储库中拥有所有内容:https://github.com/nicolas-d-torres/Syncc

第一个代码块在 app/src/main/java/gtsarandum/syncc/SynccContact 中

app/src/main/java/gtsarandum/syncc/ContactFragment 中的第二个

【问题讨论】:

if (cursor.moveToFirst()) cursor.moveToNext(); 你确定吗?我读到光标实际上在数据之前开始 我删除了它,但它仍然无法正常工作。所以这不可能 添加了我检索 ID 的方式。虽然我看不出有什么问题...... 【参考方案1】:

我知道这个答案有点晚了,但希望它能帮助遇到类似问题的其他人。您的两个游标查询都使用 id 作为字符串

ContactsContract.Contacts._ID+" = "+id,

ContactsContract.CommonDataKinds.Phone.CONTACT_ID+" = "+contactId,

应该是

ContactsContract.Contacts._ID + " = " + Uri.encode(id),

ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ Uri.encode(contactId),

【讨论】:

以上是关于通过 ID 获取联系电话号码 - 空光标的主要内容,如果未能解决你的问题,请参考以下文章

从 Android 中的 URI 检索联系人电话号码

如何通过 LookUpKey 获取联系电话号码?

ContactsContract 按联系人 ID 查找电话号码

光标与每个联系人一个电话号码

如何通过电话号码获取联系人ID

android获取联系人图片、姓名和手机号码