Android如何获取特定日期的通话次数

Android如何获取特定日期的通话次数,android,Android,我正在尝试获取特定日期的未接/传入/传出呼叫数 下面的代码运行良好,但是它得到了所有的调用计数(对于每个日期) 我不知道如何计算电话的数量例如今天的日期有人能给我提供最起码的提示,告诉我应该去哪里看或者我错过了什么吗 我尝试了此解决方案,但它返回的调用为0,而不是0 String[] projectionMissed = { CallLog.Calls.CACHED_NAME, CallLog.Calls.CACHED_NUMBER_LABEL, CallLog.Calls.TYPE };

我正在尝试获取特定日期的未接/传入/传出呼叫数

下面的代码运行良好,但是它得到了所有的调用计数(对于每个日期)

我不知道如何计算电话的数量例如今天的日期有人能给我提供最起码的提示,告诉我应该去哪里看或者我错过了什么吗

我尝试了此解决方案,但它返回的调用为0,而不是0

String[] projectionMissed = { CallLog.Calls.CACHED_NAME, CallLog.Calls.CACHED_NUMBER_LABEL, CallLog.Calls.TYPE };
        String whereMissed = CallLog.Calls.TYPE+"="+CallLog.Calls.MISSED_TYPE+ " AND " + CallLog.Calls.DATE + "=" + datetoday.getDate();
        Cursor m = getContentResolver().query(CallLog.Calls.CONTENT_URI, projectionMissed,whereMissed, null, null);
        m.moveToFirst();
好的

问题是您在SQL语句中比较的
Date
对象完全不同

CallLog.Calls.DATE
返回自纪元以来调用发生的日期,单位为毫秒

datetoday.getDate()
正在返回YYYY-MM-DD hh:MM:ss.mmm格式

好吧,你让我觉得无聊,所以像这样的事情很管用:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView mCallView = (TextView) findViewById(R.id.call);


      /*checkPermission(Manifest.permission.READ_CALL_LOG, 100);
        checkPermission(Manifest.permission.WRITE_CALL_LOG, 101);
        checkPermission(Manifest.permission.READ_CONTACTS, 102);*/

        Date date1 = new Date(calculateMilliSince1970("2020-05-28"));
        Date date2 = new Date(calculateMilliSince1970("2020-05-29"));

       mCallView.setText(getCallDetails(date1,date2));

    }


    long calculateMilliSince1970(String date)
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try
        {
            Date mDate = sdf.parse(date);
            long timeInMilliseconds = mDate.getTime();
            Log.d("TAG","Date in milli :: " + timeInMilliseconds);
            return timeInMilliseconds;
        }
        catch (ParseException e)
        {
            e.printStackTrace();
        }

        return 0;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);


        if (requestCode == 100) {

            // Checking whether user granted the permission or not.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // Showing the toast message
                Toast.makeText(MainActivity.this,
                        "Permission Granted",
                        Toast.LENGTH_SHORT)
                        .show();
            }
            else {
                Toast.makeText(MainActivity.this,
                        "Permission Denied",
                        Toast.LENGTH_SHORT)
                        .show();
            }
        }
    }

    public void checkPermission(String permission, int requestCode) {

        // Checking if permission is not granted
        if (ContextCompat.checkSelfPermission(
                MainActivity.this,
                permission)
                == PackageManager.PERMISSION_DENIED) {
            ActivityCompat
                    .requestPermissions(
                            MainActivity.this,
                            new String[] { permission },
                            requestCode);
        }
        else {
            Toast
                    .makeText(MainActivity.this,
                            "Permission already granted",
                            Toast.LENGTH_SHORT)
                    .show();
        }
    }

    private StringBuffer getCallDetails(Date date1, Date date2) {

        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 :");
        while ( managedCursor.moveToNext() ) {
            String phNumber = managedCursor.getString(number);
            String callType = managedCursor.getString(type);
            String callDate = managedCursor.getString(date);
            Date callDayTime = new Date(Long.parseLong(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 (isWithinRange(callDayTime, date1, date2)) {
                sb.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- " + dir + " \nCall Date:--- " + callDayTime + " \nCall duration in sec :--- " + callDuration);
                sb.append("\n------------------------------------------------------------------------------------------------------------------------------");
            }
        }
        managedCursor.close();
        return sb;
    }


    boolean isWithinRange(Date testDate, Date startDate, Date endDate) {

        Log.i("TAG", "isWithinRange: "+ "Test date is "+ testDate+ " start date is "+ startDate +"  compare is "+testDate.before(startDate));
        return !(testDate.before(startDate) || testDate.after(endDate));
    }

}

查看@forthelulx提供的答案并了解
CallLog.Calls.DATE
以毫秒为单位返回日期后

让它完全按照预期工作,并返回当天的电话号码

如果有人需要,下面是代码

    Date c = Calendar.getInstance().getTime();
    System.out.println("Current time => " + c);

    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yy");
    final String formattedDate = df.format(c);

    long timeInMilliseconds = c.getTime();
    long timeInMiliDayBefore = timeInMilliseconds - 86400000;

    String[] projectionMissed = { CallLog.Calls.CACHED_NAME, CallLog.Calls.CACHED_NUMBER_LABEL, CallLog.Calls.TYPE };
    String whereMissed = CallLog.Calls.TYPE+"="+CallLog.Calls.MISSED_TYPE+ " AND " + CallLog.Calls.DATE + ">=" + timeInMiliDayBefore;
    Cursor m = getContentResolver().query(CallLog.Calls.CONTENT_URI, projectionMissed,whereMissed, null, null);
    m.moveToFirst();

    String[] projectionIncoming = { CallLog.Calls.CACHED_NAME, CallLog.Calls.CACHED_NUMBER_LABEL, CallLog.Calls.TYPE };
    String whereIncoming = CallLog.Calls.TYPE+"="+CallLog.Calls.INCOMING_TYPE+ " AND " + CallLog.Calls.DATE + ">=" + timeInMiliDayBefore;
    Cursor i = getContentResolver().query(CallLog.Calls.CONTENT_URI, projectionIncoming,whereIncoming , null, null);
    i.moveToFirst();

    String[] projectionOutgoing = { CallLog.Calls.CACHED_NAME, CallLog.Calls.CACHED_NUMBER_LABEL, CallLog.Calls.TYPE };
    String whereOutgoing = CallLog.Calls.TYPE+"="+CallLog.Calls.OUTGOING_TYPE+ " AND " + CallLog.Calls.DATE + ">=" + timeInMiliDayBefore;
    Cursor o = getContentResolver().query(CallLog.Calls.CONTENT_URI, projectionOutgoing,whereOutgoing , null, null);
    o.moveToFirst();

    String numberOfIn = String.valueOf(i.getCount());
    String numberOfOut = String.valueOf(o.getCount());
    String numberOfMiss = String.valueOf(m.getCount());

    inCalls.setText(numberOfIn);
    outCalls.setText(numberOfOut);
    missCalls.setText(numberOfMiss);

已尝试,但它会以0的形式返回呼叫。首先,不允许从google读取整个呼叫历史记录,除非您的应用程序不是拨号程序应用程序。另一点是,Android只保存历史上最近的500个通话,因此您可能无法在某个日期后获取所有通话的详细信息。我遇到的问题是,我正在获取所有通话的计数,我想得到的只是电话的数量today@A.A.AlJamal我的回答解决了你的问题吗?你的回答确实帮助我找到了答案,谢谢!我不知道CallLog.Calls.DATE以毫秒为单位返回日期。
    Date c = Calendar.getInstance().getTime();
    System.out.println("Current time => " + c);

    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yy");
    final String formattedDate = df.format(c);

    long timeInMilliseconds = c.getTime();
    long timeInMiliDayBefore = timeInMilliseconds - 86400000;

    String[] projectionMissed = { CallLog.Calls.CACHED_NAME, CallLog.Calls.CACHED_NUMBER_LABEL, CallLog.Calls.TYPE };
    String whereMissed = CallLog.Calls.TYPE+"="+CallLog.Calls.MISSED_TYPE+ " AND " + CallLog.Calls.DATE + ">=" + timeInMiliDayBefore;
    Cursor m = getContentResolver().query(CallLog.Calls.CONTENT_URI, projectionMissed,whereMissed, null, null);
    m.moveToFirst();

    String[] projectionIncoming = { CallLog.Calls.CACHED_NAME, CallLog.Calls.CACHED_NUMBER_LABEL, CallLog.Calls.TYPE };
    String whereIncoming = CallLog.Calls.TYPE+"="+CallLog.Calls.INCOMING_TYPE+ " AND " + CallLog.Calls.DATE + ">=" + timeInMiliDayBefore;
    Cursor i = getContentResolver().query(CallLog.Calls.CONTENT_URI, projectionIncoming,whereIncoming , null, null);
    i.moveToFirst();

    String[] projectionOutgoing = { CallLog.Calls.CACHED_NAME, CallLog.Calls.CACHED_NUMBER_LABEL, CallLog.Calls.TYPE };
    String whereOutgoing = CallLog.Calls.TYPE+"="+CallLog.Calls.OUTGOING_TYPE+ " AND " + CallLog.Calls.DATE + ">=" + timeInMiliDayBefore;
    Cursor o = getContentResolver().query(CallLog.Calls.CONTENT_URI, projectionOutgoing,whereOutgoing , null, null);
    o.moveToFirst();

    String numberOfIn = String.valueOf(i.getCount());
    String numberOfOut = String.valueOf(o.getCount());
    String numberOfMiss = String.valueOf(m.getCount());

    inCalls.setText(numberOfIn);
    outCalls.setText(numberOfOut);
    missCalls.setText(numberOfMiss);