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

私有字符串getCallDetails(){

StringBuffer sb = new StringBuffer();
//游标managedCursor =
// getContentResolver()。query(CallLog.Calls.CONTENT_URI,null,
// null,null,null);

CursormanagedCursor = getContentResolver()。query(CallLog.Calls.CONTENT_URI,null,CallLog.Calls.DATE +“>?”,
new String [] {String.valueOf(“1451586601000”)},CallLog.Calls.NUMBER +“asc”);
整数= 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名称= managedCursor.getColumnIndex(CallLog.Calls.CACHED_NAME);
// int geoCodeColumn =
//managedCursor.getColumnIndex(CallLog.Calls.GEOCODED_LOCATION);

// sb.append(“通话详细信息:”);
同时(managedCursor.moveToNext()){
字符串phNumber = managedCursor.getString(number);
字符串callType = managedCursor.getString(type);
字符串callDate = managedCursor.getString(date);
字符串callerName = managedCursor.getString(name);
// long calldate_timeStamp = Long.parseLong(callDate);
// long temp_time = 1451586601000L;
// if(calldate_timeStamp> temp_time){
//字符串geoCode = managedCursor.getString(geoCodeColumn);
日期callDayTime =新的Date(Long.valueOf(callDate));
字符串callDuration = managedCursor.getString(duration);
字符串dir = null;
int目录代码= Integer.parseInt(callType);
开关(目录代码){
案例CallLog.Calls.OUTGOING_TYPE:
dir =“传出”;
int total_call_duration = Integer.parseInt(callDuration);
total_time = total_time + total_call_duration;
MyContact DialedContact =新的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 =“INCOMING”;
打破;

案例CallLog.Calls.MISSED_TYPE:
dir =“MISSED”;
打破;
}
}

//}
managedCursor.close();
// sb.append(“” + total_time / 60); //以分钟为单位的通话时间
返回sb.toString();

}

最佳答案

您需要:

1)权限

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

2)呼叫联系人选择器

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

意图意图=新意图(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;
    }
}

07-27 23:42