Android - 如何从通话记录中获取联系人?

Posted

技术标签:

【中文标题】Android - 如何从通话记录中获取联系人?【英文标题】:Android - How to get a contact from call log? 【发布时间】:2012-02-05 05:53:02 【问题描述】:

我正在尝试从通话记录中获取联系人。我可以使用此代码从主要联​​系人那里获取联系电话:

    public void getContacts(View view) 

    Intent intentContact = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
    startActivityForResult(intentContact, 0);



public void onActivityResult(int requestCode, int resultCode, Intent intent)


    if (requestCode == 0)
    
        try 
        to.setText(getContactInfo(intent));
         catch(NullPointerException e) 
                 // Do nothing ;)
        

    


protected String getContactInfo(Intent intent)

    String phoneNumber = to.getText().toString();
    Cursor cursor =  managedQuery(intent.getData(), null, null, null, null);
    while (cursor.moveToNext())
    
        String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
       String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
      if(phoneNumber.endsWith(">"))
          phoneNumber += ", "+name;
        else
         phoneNumber += name;
        String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

        if ( hasPhone.equalsIgnoreCase("1"))
            hasPhone = "true";
        else
            hasPhone = "false" ;

        if (Boolean.parseBoolean(hasPhone))


        
            Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null);
            while (phones.moveToNext())
               phoneNumber = phoneNumber + " <" + phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))+">";


               
            phones.close();
        


    
    cursor.close();
    return phoneNumber;

当我们点击“联系人”按钮时,它会打开一个包含所有联系人的列表,用户可以选择任何联系人,所选联系人将被添加到“收件人”字段中。我想做完全相同的事情,但我不想显示所有联系人,而是只想显示最近使用过的联系人(通话记录)以供选择。

如果你也能告诉如何对组进行此操作,那就太好了。

【问题讨论】:

【参考方案1】:

我使用自己的版本进行了此操作。我使用了一个对话框并将光标交给了通话记录。这是函数:

public void getCallLog() 

    String[] callLogFields =  android.provider.CallLog.Calls._ID,
            android.provider.CallLog.Calls.NUMBER,
            android.provider.CallLog.Calls.CACHED_NAME /* im not using the name but you can*/;
    String viaOrder = android.provider.CallLog.Calls.DATE + " DESC";
    String WHERE = android.provider.CallLog.Calls.NUMBER + " >0"; /*filter out private/unknown numbers */

    final Cursor callLog_cursor = getActivity().getContentResolver().query(
            android.provider.CallLog.Calls.CONTENT_URI, callLogFields,
            WHERE, null, viaOrder);

    AlertDialog.Builder myversionOfCallLog = new AlertDialog.Builder(
            getActivity());

    android.content.DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() 
        public void onClick(DialogInterface dialogInterface, int item) 
            callLog_cursor.moveToPosition(item);

            Log.v("number", callLog_cursor.getString(callLog_cursor
                    .getColumnIndex(android.provider.CallLog.Calls.NUMBER)));

            callLog_cursor.close();

        
    ;
    myversionOfCallLog.setCursor(callLog_cursor, listener,
            android.provider.CallLog.Calls.NUMBER);
    myversionOfCallLog.setTitle("Choose from Call Log");
    myversionOfCallLog.create().show();

【讨论】:

很好的解决方案!你能帮我知道如何在对话框中显示姓名而不是电话号码吗? 只需从 colunIndex 中提取其中一个:eu1.proxysite.com/…。我不确定它是哪一个,可能是 CACHED_NAME【参考方案2】:

您可以使用 ContactsContract.Contacts.CONTENT_STREQUENT_URI 为您提供常用联系人和已加星标的联系人。

【讨论】:

【参考方案3】:

从 API 21 可以使用这个:https://developer.android.com/reference/kotlin/android/provider/CallLog.Calls#CACHED_LOOKUP_URI

在 API 级别 21 中添加的 CACHED_LOOKUP_URI 静态 val CACHED_LOOKUP_URI: String 用于查找与电话关联的联系人的缓存 URI 编号,如果存在的话。

此值通常由拨号器应用程序填充以进行缓存 目的,因此不能保证存在,并且可能不是最新的 如果与此号码关联的联系信息已更改。

【讨论】:

以上是关于Android - 如何从通话记录中获取联系人?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Android 系统获取回调到应用程序?

如何从 android (CallLog.Calls.CONTENT_URI) 表中获取联系人姓名?

Android通讯录管理(获取联系人通话记录短信消息)

宿主手机联系人通话记录短信工具类(不断完善中。。。)

Android取证工具

Android取证工具