选择带有电话号码的联系人并读取电话号码时出现问题

5
调用联系人选择器以显示所有联系人的方法如下(在SO上已经多次提到):
Intent intent = new Intent( Intent.ACTION_PICK, Contacts.CONTENT_URI );
startActivityForResult( intent, REQ_CODE );

我正在使用以下代码片段在onActivityResult中获取联系人姓名和所有电话号码:

public void onActivityResult( int requestCode, int resultCode, Intent intent )
{
    Uri contactUri = intent.getData();
    ContentResolver resolver = getContentResolver();
    long contactId = -1;

    // get display name from the contact
    Cursor cursor = resolver.query( contactUri,
                                    new String[] { Contacts._ID, Contacts.DISPLAY_NAME }, 
                                    null, null, null );
    if( cursor.moveToFirst() )
    {
        contactId = cursor.getLong( 0 );
        Log.i( "tag", "ContactID = " + Long.toString( contactId ) );
        Log.i( "tag", "DisplayName = " + cursor.getString( 1 ) );
    }

    // get all phone numbers with type from the contact
    cursor = resolver.query( Phone.CONTENT_URI,
                             new String[] { Phone.TYPE, Phone.NUMBER }, 
                             Phone.CONTACT_ID + "=" + contactId, null, null );
    while( cursor.moveToNext() )
    {
        Log.i( "tag", "PhoneNumber = T:" + Integer.toString( cursor.getInt( 0 ) ) + " / N:" + cursor.getString( 1 ) );
    }

调用联系人选择器并仅显示具有电话号码的联系人可以像这样完成(在SO上也可以找到):
Intent intent = new Intent( Intent.ACTION_PICK );
intent.setType( ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE );
startActivityForResult( intent, REQ_CODE );

如果我这样做,我只能在联系人选择器中看到那些至少有一个电话号码的联系人,这正是我所需的。不幸的是,使用上面的代码片段,我只能获得显示名称,但再也没有任何电话号码了。
有人知道我需要更改什么才能获取电话号码吗?
提前致谢。
1个回答

2

将where子句中的Phone.Contact_Id更改为Phone._ID,如下所示:

   cursor = resolver.query( Phone.CONTENT_URI,
                             new String[] { Phone.TYPE, Phone.NUMBER }, 
                             Phone._ID + "=" + contactId, null, null );
    while( cursor.moveToNext() )
    {
        Log.i( "tag", "PhoneNumber = T:" + Integer.toString( cursor.getInt( 0 ) ) + " / N:" + cursor.getString( 1 ) );
    }

请参考这个问题了解更多细节。

希望能对您有所帮助 :)


感谢您的回答Jordi。实际问题是,在我的问题的onActivityResult方法中的第一个查询中:它返回联系人或电话的ID,具体取决于我是否在意图中设置了类型' intent.setType(..)'。由于我需要两种方式来读取联系人(使用带有电话过滤器或不带过滤器的联系人选择器),因此我将不得不根据情况在第一个查询中读取Contact._ID和DisplayName。 但是您的答案有所帮助...再次感谢。 - infero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接