如何在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;
}