在android中获取最后通话时长

时间:2013-10-21 11:31:01

标签: android calllog

我正在寻找一种最简单的方法来获取上次拨打号码的通话时长。因此,例如,如果我在拨打电话时打电话给我的妈妈,则会出现持续时间的通知。

我正在尝试以下但问题是它附带了完整的持续时间列表。传入,传出,错过。

我如何区分它:

我尝试了以下内容:

 private void getCallDetails() {

    StringBuffer sb = new StringBuffer();
    Cursor cur = getContentResolver().query( CallLog.Calls.CONTENT_URI,null, null,null, android.provider.CallLog.Calls.DATE + " DESC");

    int number = cur.getColumnIndex( CallLog.Calls.NUMBER ); 
    int duration = cur.getColumnIndex( CallLog.Calls.DURATION);
    sb.append( "Call Details : \n");
    while ( cur.moveToNext() ) {
        String phNumber = cur.getString( number );
        String callDuration = cur.getString( duration );
        String dir = null;

        sb.append( "\nPhone Number:--- "+phNumber +" \nCall duration in sec :--- "+callDuration );
        sb.append("\n----------------------------------");
    }
    cur.close();
    call.setText(sb);
}

9 个答案:

答案 0 :(得分:10)

您需要在内容查询中使用 limit 子句来获取最后的通话详细信息。 因此,您的内容查询将成为

Cursor cur = getContentResolver().query( CallLog.Calls.CONTENT_URI,
             null, null, null, android.provider.CallLog.Calls.DATE + " DESC limit 1;");

答案 1 :(得分:9)

请尝试以下代码:

private void getCallDetails() {
        StringBuffer sb = new StringBuffer();
        Uri contacts = CallLog.Calls.CONTENT_URI;
        Cursor managedCursor = context.getContentResolver().query(contacts, null, null, null, null);
        int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
        int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
        int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
        int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
        sb.append("Call Details :");
        while (managedCursor.moveToNext()) {

            HashMap rowDataCall = new HashMap<String, String>();

            String phNumber = managedCursor.getString(number);
            String callType = managedCursor.getString(type);
            String callDate = managedCursor.getString(date);
            String callDayTime = new Date(Long.valueOf(callDate)).toString();
            // long timestamp = convertDateToTimestamp(callDayTime);
            String callDuration = managedCursor.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:--- " + callDayTime + " \nCall duration in sec :--- " + callDuration);
            sb.append("\n----------------------------------");


        }
        managedCursor.close();
        System.out.println(sb);

您将在下面的行中获得“呼叫类型”:

int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);

答案 2 :(得分:3)

这是我的代码,对于上次拨出电话非常合适。

private String getCallDetails() {

    StringBuffer sb = new StringBuffer();
    Cursor managedCursor = managedQuery(CallLog.Calls.CONTENT_URI, null,
            null, null, null);
    int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
    int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
    int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
    int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);

    managedCursor.moveToLast();
        String phNumber = managedCursor.getString(number);
        String callType = managedCursor.getString(type);
        String callDate = managedCursor.getString(date);
        Date callDayTime = new Date(Long.valueOf(callDate));
        String callDuration = managedCursor.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;
        }

    if(dir.equals("OUTGOING")){
       //whatever you want here
        return "yes";
    }

    managedCursor.close();
    return "no";

}

答案 3 :(得分:2)

这段代码对我来说很好.......

void retriveCallSummary() {

            Log.i("*****retriveCallSummary******","Call retrive method worked");
            StringBuffer sb = new StringBuffer();
            Uri contacts = CallLog.Calls.CONTENT_URI;
            Cursor managedCursor = mContext.getContentResolver().query(
                    contacts, null, null, null, null);
            int number = managedCursor.getColumnIndex( CallLog.Calls.NUMBER ); 
            int duration1 = managedCursor.getColumnIndex( CallLog.Calls.DURATION);
            if( managedCursor.moveToFirst() == true ) {
                String phNumber = managedCursor.getString( number );
                String callDuration = managedCursor.getString( duration1 );
                String dir = null;
                sb.append( "\nPhone Number:--- "+phNumber +" \nCall duration in sec :--- "+callDuration );
                sb.append("\n----------------------------------");
                    Log.i("*****Call Summary******","Call Duration is:-------"+sb);
            }
            managedCursor.close();
        }

答案 4 :(得分:1)

这段代码100%我使用

public String LastCall() {
        StringBuffer sb = new StringBuffer();
        Cursor cur = getContentResolver().query( CallLog.Calls.CONTENT_URI,null, null,null, android.provider.CallLog.Calls.DATE + " DESC");

        int number = cur.getColumnIndex( CallLog.Calls.NUMBER );
        int duration = cur.getColumnIndex( CallLog.Calls.DURATION);
        sb.append("Call Details : \n");
        while ( cur.moveToNext() ) {
            String phNumber = cur.getString( number );
            String callDuration = cur.getString( duration );
            sb.append( "\nPhone Number:"+phNumber);
            break;
        }
    cur.close();
    String str=sb.toString();
    return str;
}

答案 5 :(得分:1)

获取上次通话时间,而不是之前尝试延迟

function addSpans(container, n) {
  const span = container.appendChild(document.createElement('span'));
  span.textContent = n;
  if (n >= 1) addSpans(span, n - 1);
}
addSpans(document.body, 3);

并调用Lastcall功能

private Handler finishedCall = new Handler();    
finishedCall.postDelayed(new Runnable() {
        @Override
        public void run() {
            String dura = LastCall();
    }, 1000);

答案 6 :(得分:0)

这是获取最后一次通话时间的代码。试试吧,它有效。最后一个呼叫持续时间是从呼叫记录中提取的。

  public void getCallLog() {
    StringBuffer sb = new StringBuffer();
    Cursor managedCursor = managedQuery(CallLog.Calls.CONTENT_URI, null, null, null,  null);
    int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
    int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
    int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
    int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
    sb.append("Call Details :");
    Log.e("total count", "" + managedCursor.getCount());
    //managedCursor.moveToPosition(managedCursor.getCount() - 1);
    int currentCount = 0, lastPosition = 0;
    while (managedCursor.moveToNext()) {
        currentCount++;
        //managedCursor.moveToPosition(managedCursor.getCount() - 1);
        String phNumber = managedCursor.getString(number);
        String callType = managedCursor.getString(type);
        String callDate = managedCursor.getString(date);
        Date callDayTime = new Date(Long.valueOf(callDate));
        String callDuration = managedCursor.getString(duration);
        String dir = null;
        int dircode = Integer.parseInt(callType);


        switch (dircode) {

            case CallLog.Calls.OUTGOING_TYPE:
              //  lastPosition = currentCount;
                dir = "OUTGOING";
                break;

            case CallLog.Calls.INCOMING_TYPE:
                dir = "INCOMING";
                break;

            case CallLog.Calls.MISSED_TYPE:
                dir = "MISSED";
                break;

        }
        lastPosition = currentCount;
        sb.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- " + dir + " \nCall Date:--- " + callDayTime + " \nCall duration in sec :--- " + callDuration);
        sb.append("\n----------------------------------");
        Log.e("test", sb.toString());
    }

    lastPosition--;
    managedCursor.moveToPosition(lastPosition);
    int requiredNumber = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
    int durations = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
    String phNumber = managedCursor.getString(requiredNumber);
    String dur = managedCursor.getString(durations);

    textView.setText(phNumber);
    textDuration.setText(dur);
    Log.e("last position number ", phNumber);
    Log.e("last call Duration ", dur);
    managedCursor.close();
}

答案 7 :(得分:0)

public class Home extends Activity {
    TextView textView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home_activity);
        textView = (TextView) findViewById(R.id.textview_call);
        getCallDetails();
    }

    private void getCallDetails() {

        Context context;
        StringBuffer sb = new StringBuffer();
        Uri contacts = CallLog.Calls.CONTENT_URI;
        try {
            Cursor managedCursor = getContentResolver().query( CallLog.Calls.CONTENT_URI,null, null,null, android.provider.CallLog.Calls.DATE + " DESC limit 1;");
            int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
            int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
            int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
            int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
            sb.append("Call Details :");
            while (managedCursor.moveToNext()) {

                HashMap rowDataCall = new HashMap<String, String>();

                String phNumber = managedCursor.getString(number);
                String callType = managedCursor.getString(type);
                String callDate = managedCursor.getString(date);
                String callDayTime = new Date(Long.valueOf(callDate)).toString();
                // long timestamp = convertDateToTimestamp(callDayTime);
                String callDuration = managedCursor.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:--- " + callDayTime + " \nCall duration in sec :--- " + callDuration);
                sb.append("\n----------------------------------");


            }
            managedCursor.close();
            System.out.println(sb);
            textView.setText(sb);
        }
        catch (SecurityException e)
        {
            System.out.println();
             // lets the user know there is a problem with the code
        }




    }
}

答案 8 :(得分:0)

使用以下排序顺序:

CallLog.Calls.DATE " + " + CallLog.Calls.DURATION + " * 1000 desc "