如何在android studio中获取通话日志(联系人姓名、号码、日期、类型、持续时间)
我写了一个小程序从设备上获取呼叫日志。到目前为止,它运行良好。但是现在我也想知道联系人的名字。目前,它只显示联系人号码、呼叫类型(传入、传出或未接来电)、持续时间、日期。我也想知道联系人的名字,但是我找不到。请帮帮忙 谢谢,, 尤汉如何在android studio中获取通话日志(联系人姓名、号码、日期、类型、持续时间),android,android-contacts,calllog,Android,Android Contacts,Calllog,我写了一个小程序从设备上获取呼叫日志。到目前为止,它运行良好。但是现在我也想知道联系人的名字。目前,它只显示联系人号码、呼叫类型(传入、传出或未接来电)、持续时间、日期。我也想知道联系人的名字,但是我找不到。请帮帮忙 谢谢,, 尤汉 /*此方法返回字符串值并将其设置为xml布局文件中的textView。此外,此方法位于主活动中*/ 公共字符串getCallDetails(){ StringBuffer sb=新的StringBuffer(); @SuppressLint(“MissingPerm
/*此方法返回字符串值并将其设置为xml布局文件中的textView。此外,此方法位于主活动中*/
公共字符串getCallDetails(){
StringBuffer sb=新的StringBuffer();
@SuppressLint(“MissingPermission”)游标游标=getActivity().getContentResolver().query(CallLog.Calls.CONTENT\u URI,null,null,null);
int number=cursor.getColumnIndex(CallLog.Calls.number);
int type=cursor.getColumnIndex(CallLog.Calls.type);
int date=cursor.getColumnIndex(CallLog.Calls.date);
int duration=cursor.getColumnIndex(CallLog.Calls.duration);
sb.追加(“呼叫详细信息:\n\n”);
while(cursor.moveToNext()){
字符串phNumber=cursor.getString(数字);
String callType=cursor.getString(类型);
String callDate=cursor.getString(日期);
Date CallDayer=新日期(长值of(callDate));
SimpleDataFormat格式化程序=新的SimpleDataFormat(“dd-MM-yy-HH:MM”);
String dateString=formatter.format(callDaily);
String callDuration=cursor.getString(duration);
字符串dir=null;
int dircode=Integer.parseInt(callType);
开关(dircode){
案例CallLog.Calls.OUTGOING_类型:
dir=“传出”;
打破
案例CallLog.Calls.INCOMING_类型:
dir=“传入”;
打破
案例CallLog.Calls.MISSED_类型:
dir=“Missed”;
打破
}
sb.追加(“\n电话号码:“+phNumber+”\n呼叫类型:“+dir+”\n呼叫日期:“+dateString+”\n呼叫持续时间:“+callDuration”);
某人附加(……);
}
cursor.close();
使某人返回字符串();
}
/*这是xml文件*/
您需要对电话号码执行查找查询,以检查其是否属于某个联系人,然后提取该联系人的显示名称
您也可以使用CallLog.Calls的CACHED_NAME字段来省去运行该查找查询的麻烦,但它并不保证被填充,通常是已经运行该查找的应用程序,例如您的应用程序在CACHED_NAME字段中存储找到的名称,以加快应用程序的下一次运行
代码:
您需要对电话号码运行查找查询,以检查其是否属于某个联系人,然后提取该联系人的显示名称 您也可以使用CallLog.Calls的CACHED_NAME字段来省去运行该查找查询的麻烦,但它并不保证被填充,通常是已经运行该查找的应用程序,例如您的应用程序在CACHED_NAME字段中存储找到的名称,以加快应用程序的下一次运行 代码:
/*This is the method which returns a String value and set it to the textView in xml layout file. Further, this method located in Main Activity*/
public String getCallDetails(){
StringBuffer sb = new StringBuffer();
@SuppressLint("MissingPermission") Cursor cursor = getActivity().getContentResolver().query(CallLog.Calls.CONTENT_URI,null,null,null,null);
int number = cursor.getColumnIndex(CallLog.Calls.NUMBER);
int type = cursor.getColumnIndex(CallLog.Calls.TYPE);
int date = cursor.getColumnIndex(CallLog.Calls.DATE);
int duration = cursor.getColumnIndex(CallLog.Calls.DURATION);
sb.append("Call Details : \n\n");
while(cursor.moveToNext()){
String phNumber = cursor.getString(number);
String callType = cursor.getString(type);
String callDate = cursor.getString(date);
Date callDayTime = new Date(Long.valueOf(callDate));
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yy HH:mm");
String dateString = formatter.format(callDayTime);
String callDuration = cursor.getString(duration);
String dir = null;
int dircode = Integer.parseInt(callType);
switch (dircode){
case CallLog.Calls.OUTGOING_TYPE:
dir = "Outgoing";
break;
case CallLog.Calls.INCOMING_TYPE:
dir = "Incoming";
break;
case CallLog.Calls.MISSED_TYPE:
dir = "Missed";
break;
}
sb.append("\nPhone Number : " + phNumber+"\nCall Type : " + dir+"\nCall Date : "+dateString+"\nCall Duration : "+callDuration);
sb.append("...................");
}
cursor.close();
return sb.toString();
}
/*This is the xml file*/
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".LogFragment">
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/textview_call"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
</ScrollView>
</RelativeLayout>
public String getCallDetails(){
StringBuffer sb = new StringBuffer();
Cursor cursor = getActivity().getContentResolver().query(CallLog.Calls.CONTENT_URI,null,null,null,null);
...
int cachedNameIndex = cursor.getColumnIndex(CallLog.Calls.CACHED_NAME);
sb.append("Call Details : \n\n");
while(cursor.moveToNext()){
...
String cachedName = cursor.getString(cachedNameIndex);
if (TextUtils.isEmpty(cachedName)) {
String updatedName = queryPhone(number);
sb.append("number=" + number + ", updated-name=" + updatedName);
// it's common practice to update CACHED_NAME field with the found name at this point
} else {
sb.append("number=" + number + ", cached-name=" + cachedName);
}
sb.append("...................");
}
cursor.close();
return sb.toString();
}
private String queryPhone(String number) {
String name = null;
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
Cursor cursor = getActivity().getContentResolver().query(uri, new String[]{PhoneLookup.DISPLAY_NAME}, null, null, null);
if (cursor.moveToFirst()) {
name = cursor.getString(0);
}
cursor.close();
return name;
}