从设备的所有帐户获取事件,仅获取今天的事件 [英] Get events from all accounts of the device and only events for today

查看:51
本文介绍了从设备的所有帐户获取事件,仅获取今天的事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要获取今天日历上的活动数量.只有所有日历的事件数,不需要更多. 我发现了几个相关的话题,但无法获得今天的活动数量.

I need to get the number of events on the calendars for today. Only the number of events of all calendars, do not need anything more. I found several threads about it, but I can not get the number of events for today.

使用此代码,变量事件"为我提供了第一个日历中所有事件的数量.

using this code, the variable "events" gives me the number of all events in the first calendar.

int events=0;

    public void read() {

        Context context = getApplicationContext();    
        ContentResolver contentResolver = context.getContentResolver();  

        long ntime = System.currentTimeMillis();  

        Cursor cursr = contentResolver.query(Uri.parse("content://com.android.calendar/events"), new String[]{ "calendar_id", "title", "description", "dtstart", "dtend", "eventLocation" }, "calendar_id=1", null, null);       
        cursr.moveToFirst();  
        String[] CalNames = new String[cursr.getCount()];  
        int[] CalIds = new int[cursr.getCount()];  
        for (int i = 0; i < CalNames.length; i++) {  
            CalIds[i] = cursr.getInt(0);             
            CalNames[i] = "Event"+cursr.getInt(0)+": \nTitle: "+ cursr.getString(1)+"\nDescription: "+cursr.getString(2)+"\nStart Date: "+cursr.getLong(3)+"\nEnd Date : "+cursr.getLong(4)+"\nLocation : "+cursr.getString(5);  
            long StartTime = cursr.getLong(3);  
            long EndTime = cursr.getLong(4);  

            if ((StartTime<ntime)&&(ntime<EndTime)) {  
                System.out.println("In the middle of something");  
                break;  
            }                  
            cursr.moveToNext();  
            events++;
        }  
        cursr.close(); 
        Log.i("control","vueltas:"+events);
        events=0;
    }

我需要修改代码以从设备的所有日历中读取事件,并且仅读取今天的事件. 几天寻找如何做,但是我找到的解决方案(包括此页面)不知道如何应用我的代码... 有一个非常类似于我的问题,但没有答案 https://stackoverflow.com/questions/18301870/get-todays-calendar-events

I need to modify the code to read events from all calendars of the device, and only events for today. several days looking for how to do it, but the solutions I've found (including this page) do not know how to apply my code... There is a very similar to my question, but has no answer https://stackoverflow.com/questions/18301870/get-todays-calendar-events

感谢您的帮助.

推荐答案

您需要做的是查询日历,并针对每个日历查询事件实例并对其进行计数. 像这样的东西

What you need to do is query the calendars, and for each of them, query the events instances and just count them. Something like that

// Projection array. Creating indices for this array instead of doing
// dynamic lookups improves performance.
private static final String[] CALENDAR_PROJECTION = new String[] { Calendars.ACCOUNT_NAME };
private static final String[] INSTANCE_PROJECTION = new String[] { Instances._ID };

// The indices for the projection array above.
private static final int PROJECTION_ACCOUNT_NAME_INDEX = 0;

// this is the method that returns the count of all events for all the calendars
public static int getAllEventsCount(final Context context)
{
    int eventsCount = 0;

    // queries the calendars
    final Cursor calendarCursor = context.getContentResolver().query(Calendars.CONTENT_URI, CALENDAR_PROJECTION, null, null, null);
    while (calendarCursor.moveToNext())
    {
        // gets the calendar name - you need that to query the instances for each calendar
        final String accountName = calendarCursor.getString(PROJECTION_ACCOUNT_NAME_INDEX);
        eventsCount = eventsCount + getCalendarEventsCount(context, accountName);
    }
    calendarCursor.close();
    return eventsCount;
}

// this method gets a count of the events in a given calendar
private static int getCalendarEventsCount(final Context context, final String accountName)
{
    final Calendar beginTime = Calendar.getInstance();
    final Calendar endTime = Calendar.getInstance();

    // get events from the start of the day until the same evening.
    beginTime.set(beginTime.get(Calendar.YEAR), beginTime.get(Calendar.MONTH), beginTime.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
    endTime.set(beginTime.get(Calendar.YEAR), beginTime.get(Calendar.MONTH), beginTime.get(Calendar.DAY_OF_MONTH), 23, 59, 59);

    final long startMillis = beginTime.getTimeInMillis();
    final long endMillis = endTime.getTimeInMillis();

    // Construct the query with the desired date range.
    final Uri.Builder builder = Instances.CONTENT_URI.buildUpon();
    ContentUris.appendId(builder, startMillis);
    ContentUris.appendId(builder, endMillis);

    final String selection = "(" + Calendars.ACCOUNT_NAME + " = ?)";
    final String[] selectionArgs = new String[] { accountName };
    final Cursor cursor = context.getContentResolver().query(builder.build(), INSTANCE_PROJECTION, selection, selectionArgs, Instances.BEGIN + " ASC");
    int count = cursor.getCount();
    cursor.close();
    return count;
}

这已经过测试,可以正常工作. 希望对您有所帮助.

This has been tested and it works. Hope it helps.

这篇关于从设备的所有帐户获取事件,仅获取今天的事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆