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

Lal*_*era 5 java android

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

私有字符串 getCallDetails() {

        StringBuffer sb = new StringBuffer();
        // 游标管理游标 =
        // getContentResolver().query(CallLog.Calls.CONTENT_URI, 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 类型 = 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 地理代码列 =
        // ManagedCursor.getColumnIndex(CallLog.Calls.GEOCODED_LOCATION);

        // sb.append("通话详情:");
        while (managedCursor.moveToNext()) {
            String phNumber = ManagedCursor.getString(number);
            String callType = ManagedCursor.getString(type);
            String callDate = ManagedCursor.getString(date);
            String callerName = ManagedCursor.getString(name);
            // long calldate_timeStamp= Long.parseLong(callDate);
            //长temp_time = 1451586601000L;
            // if(calldate_timeStamp>temp_time){
            // 字符串 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);
                总时间 = 总时间 + 总通话时长;
                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+ " \n地理编码: " );
                 sb.append("\n----------------------------------");

                休息;

            案例 CallLog.Calls.INCOMING_TYPE:
                dir = "传入";
                休息;

            案例CallLog.Calls.MISSED_TYPE:
                目录=“错过”;
                休息;
            }
        }

        // }
        管理游标.close();
    // sb.append("" + total_time / 60);// 通话时长(分钟)
        返回 sb.toString();

    }

Sta*_*vic 0

你需要:

1)权限

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

2) 调用联系人选择器

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

意图意图 = 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);
Run Code Online (Sandbox Code Playgroud)

3) 聆听结果

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

您可以通过对数据 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;
    }
}
Run Code Online (Sandbox Code Playgroud)