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

Posted

技术标签:

【中文标题】如何从 android (CallLog.Calls.CONTENT_URI) 表中获取联系人姓名?【英文标题】:How I can get the contact name from the android (CallLog.Calls.CONTENT_URI) table? 【发布时间】:2016-05-05 19:15:22 【问题描述】:

我是 android 新手,正在开发一个需要所有拨出通话记录、号码、通话时长和联系人姓名的应用程序。所以我的问题是我可以获取android系统的CallLog.Calls.CONTENT_URI表的呼出电话的名称和号码,还是我需要从单独的表中读取并映射它。下面是我的代码。提前致谢。

私人字符串 getCallDetails() StringBuffer sb = new StringBuffer(); // 光标 managedCursor = // getContentResolver().query(CallLog.Calls.CONTENT_URI, null, // null, null, null); 光标 managedCursor = getContentResolver().query(CallLog.Calls.CONTENT_URI, null, CallLog.Calls.DATE + ">?", new String[] String.valueOf("1451586601000") , CallLog.Calls.NUMBER + "asc"); int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER); int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE); int date = managedCursor.getColumnIndex(CallLog.Calls.DATE); int 持续时间 = managedCursor.getColumnIndex(CallLog.Calls.DURATION); int name = managedCursor.getColumnIndex(CallLog.Calls.CACHED_NAME); // int geoCodeColumn = // managedCursor.getColumnIndex(CallLog.Calls.GEOCODED_LOCATION); // sb.append("调用详情:"); while (managedCursor.moveToNext()) String phNumber = managedCursor.getString(number); String callType = managedCursor.getString(type); 字符串 callDate = managedCursor.getString(date); String callerName = managedCursor.getString(name); // long calldate_timeStamp= Long.parseLong(callDate); // long temp_time = 1451586601000L; // if(calldate_timeStamp>temp_time) // String geoCode = managedCursor.getString(geoCodeColumn); 日期 callDayTime = new Date(Long.valueOf(callDate)); String callDuration = managedCursor.getString(duration); 字符串目录=空; int dircode = Integer.parseInt(callType); 开关(目录代码) 案例 CallLog.Calls.OUTGOING_TYPE: dir = "外出"; int total_call_duration = Integer.parseInt(callDuration); total_time = total_time + total_call_duration; MyContact dialedContact = new MyContact(); dialedContact.setPhoneNumber(Long.parseLong(phNumber)); dialedContact.setCallDuration(Integer.parseInt(callDuration)); // dialedContact.se sb.append("\n电话号码:--- " + phNumber + " \nCallType:--- " + dir + " \n通话日期:--- " + callDayTime + " \n通话时长以秒为单位:--- " + callDuration+ " \nGeocode: " ); sb.append("\n---------------------------------"); 休息; 案例 CallLog.Calls.INCOMING_TYPE: dir = "传入"; 休息; 案例 CallLog.Calls.MISSED_TYPE: dir = "错过"; 休息; // managedCursor.close(); // sb.append("" + total_time / 60);// 通话时长(分钟) 返回 sb.toString();

【问题讨论】:

【参考方案1】:

您需要:

1) 权限

向您的应用程序清单添加读取联系人数据的权限。

2) 调用联系人选择器

在您的 Activity 中,创建一个 Intent,要求系统从联系人 URI 中的项目中找到可以执行 PICK 操作的 Activity。

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 调用 startActivityForResult,传入此 Intent(以及请求代码整数,在本例中为 PICK_CONTACT)。这将导致 Android 启动一个在 People.CONTENT_URI 上注册为支持 ACTION_PICK 的 Activity,然后在做出(或取消)选择时返回此 Activity。

startActivityForResult(intent, PICK_CONTACT);

3) 监听结果

同样在您的 Activity 中,重写 onActivityResult 方法以侦听您在第 2 步中启动的“选择联系人”Activity 的返回。您应该检查返回的请求代码是否与您期望的值匹配,并且结果代码为 RESULT_OK。

您可以通过对数据 Intent 参数调用 getData() 来获取所选联系人的 URI。要获取所选联系人的姓名,您需要使用该 URI 创建一个新查询并从返回的光标中提取姓名。

@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) 
  super.onActivityResult(reqCode, resultCode, data); 
switch (reqCode) 
case (PICK_CONTACT) :
if (resultCode == Activity.RESULT_OK) 
Uri contactData = data.getData();
Cursor c =  getContentResolver().query(contactData, null, null, null, null);
if (c.moveToFirst()) 
String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
// TODO Whatever you want to do with the selected contact name. 
    

break;
    

【讨论】:

以上是关于如何从 android (CallLog.Calls.CONTENT_URI) 表中获取联系人姓名?的主要内容,如果未能解决你的问题,请参考以下文章

android: 如何从 Android Support Lib 版本 4 向 PagerTabStrip 添加图标/drawables?

Android:从片段调用时如何从活动中获取返回结果?

Android:如何在 android 中从服务器打开 pdf 文件 [关闭]

如何从 android 活动启动 Unity 应用程序?

Android -- 如何从 https 获取图片

如何从 Android 设备获取 apk 文件?