我是 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();
}
你需要:
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)
| 归档时间: |
|
| 查看次数: |
2988 次 |
| 最近记录: |