以编程方式在Android日历中添加提醒? [复制]

2023-12-13

可能的重复:
如何在Android中添加日历事件?

我们如何在Android日历中添加提醒数据?


这是我用于 ICS 的一个类

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CalendarContract;
import android.provider.CalendarContract.Calendars;
import android.provider.CalendarContract.Events;
import android.provider.CalendarContract.Reminders;
import android.util.Log;

public class IcsCalendarHelper {

//Remember to initialize this activityObj first, by calling initActivityObj(this) from 
//your activity  
private static final String DEBUG_TAG = "CalendarActivity";
private static Activity activityObj;

public static void initActivityObj(Activity obj)
{
        activityObj = obj;
}

public static void IcsMakeNewCalendarEntry(String title,String description,String location,long startTime,long endTime, int allDay,int hasAlarm, int calendarId,int selectedReminderValue) {

        ContentResolver cr = activityObj.getContentResolver();
        ContentValues values = new ContentValues();
        values.put(Events.DTSTART, startTime);
        values.put(Events.DTEND, endTime);
        values.put(Events.TITLE, title);
        values.put(Events.DESCRIPTION, description);
        values.put(Events.CALENDAR_ID, calendarId);

        if (allDay == 1)
        {
            values.put(Events.ALL_DAY, true);
        }

        if (hasAlarm==1)
        {
            values.put(Events.HAS_ALARM, true);
        }

        //Get current timezone
        values.put(Events.EVENT_TIMEZONE,TimeZone.getDefault().getID());
        Log.i(DEBUG_TAG, "Timezone retrieved=>"+TimeZone.getDefault().getID());
        Uri uri = cr.insert(Events.CONTENT_URI, values);
        Log.i(DEBUG_TAG, "Uri returned=>"+uri.toString());
        // get the event ID that is the last element in the Uri
        long eventID = Long.parseLong(uri.getLastPathSegment());

        if (hasAlarm==1)
        {
            ContentValues reminders = new ContentValues();
            reminders.put(Reminders.EVENT_ID, eventID);
            reminders.put(Reminders.METHOD, Reminders.METHOD_ALERT);
            reminders.put(Reminders.MINUTES, selectedReminderValue);

            Uri uri2 = cr.insert(Reminders.CONTENT_URI, reminders);
        }


}

}

如果您的应用程序面向 Android 6.0 及更高版本,则下面的类包含用于在运行时请求读/写日历权限的辅助函数。

一个工作示例GitHub

package testpreference.com.testcalendar;

import android.Manifest;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.provider.CalendarContract.Events;
import android.provider.CalendarContract.Reminders;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.TimeZone;

public class CalendarHelper {

    //Remember to initialize this activityObj first, by calling initActivityObj(this) from
//your activity
    private static final String TAG = "CalendarHelper";
    public static final int CALENDARHELPER_PERMISSION_REQUEST_CODE = 99;


    public static void MakeNewCalendarEntry(Activity caller,String title,String description,String location,long startTime,long endTime, boolean allDay,boolean hasAlarm, int calendarId,int selectedReminderValue) {

        ContentResolver cr = caller.getContentResolver();
        ContentValues values = new ContentValues();
        values.put(Events.DTSTART, startTime);
        values.put(Events.DTEND, endTime);
        values.put(Events.TITLE, title);
        values.put(Events.DESCRIPTION, description);
        values.put(Events.CALENDAR_ID, calendarId);
        values.put(Events.STATUS, Events.STATUS_CONFIRMED);


        if (allDay)
        {
            values.put(Events.ALL_DAY, true);
        }

        if (hasAlarm)
        {
            values.put(Events.HAS_ALARM, true);
        }

        //Get current timezone
        values.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());
        Log.i(TAG, "Timezone retrieved=>"+TimeZone.getDefault().getID());
        Uri uri = cr.insert(Events.CONTENT_URI, values);
        Log.i(TAG, "Uri returned=>"+uri.toString());
        // get the event ID that is the last element in the Uri
        long eventID = Long.parseLong(uri.getLastPathSegment());

        if (hasAlarm)
        {
            ContentValues reminders = new ContentValues();
            reminders.put(Reminders.EVENT_ID, eventID);
            reminders.put(Reminders.METHOD, Reminders.METHOD_ALERT);
            reminders.put(Reminders.MINUTES, selectedReminderValue);

            Uri uri2 = cr.insert(Reminders.CONTENT_URI, reminders);
        }


    }

    public static void requestCalendarReadWritePermission(Activity caller)
    {
        List<String> permissionList = new ArrayList<String>();

        if  (ContextCompat.checkSelfPermission(caller,Manifest.permission.WRITE_CALENDAR)!=PackageManager.PERMISSION_GRANTED)
        {
            permissionList.add(Manifest.permission.WRITE_CALENDAR);

        }

        if  (ContextCompat.checkSelfPermission(caller,Manifest.permission.READ_CALENDAR)!=PackageManager.PERMISSION_GRANTED)
        {
            permissionList.add(Manifest.permission.READ_CALENDAR);

        }

        if (permissionList.size()>0)
        {
            String [] permissionArray = new String[permissionList.size()];

            for (int i=0;i<permissionList.size();i++)
            {
                permissionArray[i] = permissionList.get(i);
            }

            ActivityCompat.requestPermissions(caller,
                    permissionArray,
                    CALENDARHELPER_PERMISSION_REQUEST_CODE);
        }

    }

    public static Hashtable listCalendarId(Context c) {

        if (haveCalendarReadWritePermissions((Activity)c)) {

            String projection[] = {"_id", "calendar_displayName"};
            Uri calendars;
            calendars = Uri.parse("content://com.android.calendar/calendars");

            ContentResolver contentResolver = c.getContentResolver();
            Cursor managedCursor = contentResolver.query(calendars, projection, null, null, null);

            if (managedCursor.moveToFirst())
            {
                String calName;
                String calID;
                int cont = 0;
                int nameCol = managedCursor.getColumnIndex(projection[1]);
                int idCol = managedCursor.getColumnIndex(projection[0]);
                Hashtable<String,String> calendarIdTable = new Hashtable<>();

                do
                {
                    calName = managedCursor.getString(nameCol);
                    calID = managedCursor.getString(idCol);
                    Log.v(TAG, "CalendarName:" + calName + " ,id:" + calID);
                    calendarIdTable.put(calName,calID);
                    cont++;
                } while (managedCursor.moveToNext());
                managedCursor.close();

                return calendarIdTable;
            }

        }

        return null;

    }

    public static boolean haveCalendarReadWritePermissions(Activity caller)
    {
        int permissionCheck = ContextCompat.checkSelfPermission(caller,
                Manifest.permission.READ_CALENDAR);

        if (permissionCheck== PackageManager.PERMISSION_GRANTED)
        {
            permissionCheck = ContextCompat.checkSelfPermission(caller,
                    Manifest.permission.WRITE_CALENDAR);

            if (permissionCheck== PackageManager.PERMISSION_GRANTED)
            {
                return true;
            }
        }

        return false;
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以编程方式在Android日历中添加提醒? [复制] 的相关文章

随机推荐

  • 如何使用 JavaScript 发送电子邮件?

    如何使用 JavaScript 发送电子邮件 我不想使用mailto 因为如果我使用mailto 它会打开一个电子邮件客户端 做不到 发送电子邮件仅适用于服务器端 如果您所做的只是发送电子邮件 那么快速PHP脚本可能会达到目的
  • Delphi Tokyo 中不再使用 Form.PixelsPerInch

    在较旧的 Delphi 中 例如 Delphi XE4 很清楚Form PixelsPerInch财产是为了 如果我更改此属性并保存表单 关闭然后重新加载它 则表单上的所有控件和字体将相应地调整大小 然而 在德尔福东京 也许自西雅图以来 进
  • 无效的 Geojson 对象 Angularjs &Leafletjs

    在我的项目中 我尝试将过滤器与表和地图上显示的 geojson 同步 为了实现这一目标 我使用了 Angular 和以前的 Angular Leaflet Directive 但性能对于我的目的来说很慢 所以我决定为 Leaflet js
  • 如何在不同的语言环境下使用 PostgreSQL upper() 函数?

    我在共享主机上有一个 PostgreSQL 数据库 使用的结果upper由于区域设置的原因 我的本地数据库中的函数有所不同 这是我想要的 并且在我的本地环境中拥有 SELECT version PostgreSQL 8 4 16 on i3
  • Python-根据列值将数据帧拆分为多个数据帧并用这些值命名它们[重复]

    这个问题在这里已经有答案了 我有一个大型数据集 列出了在全国不同地区销售的竞争对手产品 我希望通过使用这些新数据帧名称中的列值的迭代过程 根据区域将该数据帧拆分为其他几个数据帧 以便我可以单独处理每个数据帧 例如按价格对每个地区的信息进行排
  • Python Turtle 图形键盘命令

    有人对使用键盘命令在 python 2 7 中控制海龟图形有任何见解吗 我在这个网站和其他网站上进行了广泛的研究 觉得我正在做正确的事情 但它只是不想为我工作 以下是我到目前为止所得到的 谁能告诉我哪里出错了 from turtle imp
  • Django 模板过滤器 - 一行

    我正在寻找一个 Django 模板过滤器 它将多行结构转变为一大行 有人实施过吗 原因是 我有一个表单 form as p 创建一个多行html片段 我想创建一个javascript变量 它是一个html片段 但是当我这样做时 var ne
  • 启用和禁用 gridview 上的链接按钮

    我想根据条件在 gridview 的某些行上启用或禁用链接按钮 我可以在一行上启用 linkbutton 并在同一网格视图的另一行上禁用它吗 我的代码在这里 protected void GridView1 RowDataBound obj
  • 使用 regex_search 获取所有匹配项的索引?

    我刚刚开始学习如何使用regex用于字符串处理 C 11新功能 如果以下问题太愚蠢 请原谅我 目前我应用以下代码来获取所有匹配项的索引 string str aaabxxxaab regex rx ab vector
  • 为什么 3 和 x(被分配为 3)在 Haskell 中具有不同的推断类型? [复制]

    这个问题在这里已经有答案了 Haskell 中的类型推断有一点学习曲线 至少可以这么说 开始学习它的一个好方法是通过简单的例子 因此 以下是类型推断的 hello world 考虑以下示例 Prelude gt t 3 3 Num t gt
  • 无符号整数溢出

    将会发生什么unsigned int当我溢出它时包含它 具体来说 我想与两个相乘unsigned ints 里面会有什么unsigned int乘法完成后 unsigned int someint 253473829 13482018273
  • 为什么不能使用 memcmp() 函数比较浮点类型?

    bool floatcmp const float a const float b const void p void a const void q void b if memcmp p q sizeof float 0 return tr
  • 如何使我的自定义类型与“基于范围的 for 循环”一起使用?

    像现在很多人一样 我一直在尝试 C 11 带来的不同功能 我最喜欢的之一是 基于范围的 for 循环 我明白那个 for Type v a 相当于 for auto iv begin a iv end a iv Type v iv 然后be
  • 在另一个接口中使用 Typescript 接口的一个属性

    假设我有一个 Typescript 接口 如下所示 export interface IMyObj id string type AA AZ XY 现在我需要另一个也有这个接口type field export interface IMyO
  • 释放 (vfree-ing) 指向易失性数据的指针

    volatile似乎是每个人永无止境的问题 我以为我已经知道了一切 但后来我遇到了这个 所以 我有一块在线程之间共享的内存 我这样定义它 volatile type name 如果这让你感觉好一点 你可以想象type只是一个int 这意味着
  • Singleton 实现中的按需初始化惯用法与简单静态初始化器

    当使用静态初始化实现线程安全单例时 Initialize On Demand 习惯是否真的有必要 或者实例的简单静态声明就足够了 将实例简单声明为静态字段 class Singleton private static Singleton i
  • 为什么 gems 安装在与我运行的 Ruby 版本不同的目录中?

    当我安装 gem 时 它会安装在名为 1 9 1 的目录中 尽管这不是我安装的 Ruby 版本 ruby v ruby 1 9 3p327 2012 11 10 revision 37606 x86 64 darwin12 2 0 gem
  • Objective-C 中的继承和类别有什么区别

    有人可以向我解释一下 Objective C 中类别和继承之间的区别吗 我读了维基百科中的条目那里关于类别的讨论看起来与继承的讨论没有任何不同 我也看了 开放iPhone开发 一书中关于该主题的讨论 仍然不明白 有时 继承似乎比它的价值更麻
  • 使弹性项目从下到上

    以下 HTML 和 CSS 创建一个 条形图 但图表列从上到下增长 怎样才能让它们从下往上生长呢 box sizing border box font size 0 text align center line height 50px ba
  • 以编程方式在Android日历中添加提醒? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在Android中添加日历事件 我们如何在Android日历中添加提醒数据 这是我用于 ICS 的一个类 import android app Activity import android co