• Android 向系统日历中添加事件


      查了一天半,总算有点大概了。以下是自己的理解,有错误的地方望指正。

      android系统有日历功能,应用程序可以根据一些接口开发自己的功能,即使是日历app也是根据这些接口开发的,所以我们可以利用程序向系统日历写入事件,然后用手机上的日历软件就可以看到我们添加的事件。网上这方面资料也不少,也有demo,但是我没找到一个可以正确运行的,有的是缺少参数,有的是版本的原因,4.0以上的系统这方面变动比较大,所以只能一边查资料一边修改。

      大体思路就是:先查看系统日历是否有账户,如果没有必须要添加一个,然后才可以添加事件。其中有好多参数是必须要填的,还有什么 sync adapter。事件的保存是按账户为单位的。

      目前还不完善,删除时会把系统日历中的所有账户都删除,请注意!!!

    大体框架利用:http://blog.csdn.net/Android_Tutor/article/details/6165470 ,感谢原作者的分享。为了体现原作者的向往情怀,事件内容维持不变!!

    在此基础上做了完善以及进行了主要的注释。

    用户权限:

    01.<uses-permission android:name="android.permission.READ_CALENDAR"/>   
    02.<uses-permission android:name="android.permission.WRITE_CALENDAR"/> 

    XML:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="向系统日历中添加事件" />
    
        <Button
            android:id="@+id/inputaccount"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text="添加账户" />
        
        <Button
            android:id="@+id/readUserButton"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text="查看账户" />
    
        <Button
            android:id="@+id/readEventButton"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text="查看事件" />
    
        <Button
            android:id="@+id/writeEventButton"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text="插入事件" />
        
        <Button
            android:id="@+id/delEventButton"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text="删除事件" />
    
    </LinearLayout>

    主程序代码:

    package com.example.canlendertesttwo;
    
    import java.util.Calendar;
    import java.util.TimeZone;
    
    import android.app.Activity;
    import android.content.ContentValues;
    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.view.View;
    import android.widget.Toast;
    
    
    public class MainActivity extends Activity {
    
        //Android2.2版本以后的URL,之前的就不写了 
        private static String calanderURL = "content://com.android.calendar/calendars";
        private static String calanderEventURL = "content://com.android.calendar/events";
        private static String calanderRemiderURL = "content://com.android.calendar/reminders";
    
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
        }
    
        public void onClick(View v) {
            if (v.getId() == R.id.readUserButton) {  //读取系统日历账户,如果为0的话先添加
                Cursor userCursor = getContentResolver().query(Uri.parse(calanderURL), null, null, null, null);
                
                System.out.println("Count: " + userCursor.getCount());            
                Toast.makeText(this, "Count: " + userCursor.getCount(), Toast.LENGTH_LONG).show();    
                
                for (userCursor.moveToFirst(); !userCursor.isAfterLast(); userCursor.moveToNext()) {
                    System.out.println("name: " + userCursor.getString(userCursor.getColumnIndex("ACCOUNT_NAME")));
                    
                    
                    String userName1 = userCursor.getString(userCursor.getColumnIndex("name"));
                    String userName0 = userCursor.getString(userCursor.getColumnIndex("ACCOUNT_NAME"));
                    Toast.makeText(this, "NAME: " + userName1 + " -- ACCOUNT_NAME: " + userName0, Toast.LENGTH_LONG).show();
                }
            }
            else if (v.getId() == R.id.inputaccount) {        //添加日历账户
                initCalendars();
                
            }
            else if (v.getId() == R.id.delEventButton) {  //删除事件
        
                int rownum = getContentResolver().delete(Uri.parse(calanderURL), "_id!=-1", null);  //注意:会全部删除所有账户,新添加的账户一般从id=1开始,
                                                                                                      //可以令_id=你添加账户的id,以此删除你添加的账户    
                Toast.makeText(MainActivity.this, "删除了: " + rownum, Toast.LENGTH_LONG).show();
                
            }
            else if (v.getId() == R.id.readEventButton) {  //读取事件
                Cursor eventCursor = getContentResolver().query(Uri.parse(calanderEventURL), null, null, null, null);
                if (eventCursor.getCount() > 0) {
                    eventCursor.moveToLast();             //注意:这里与添加事件时的账户相对应,都是向最后一个账户添加
                    String eventTitle = eventCursor.getString(eventCursor.getColumnIndex("title"));
                    Toast.makeText(MainActivity.this, eventTitle, Toast.LENGTH_LONG).show();
                }
            }
            else if (v.getId() == R.id.writeEventButton) {
                // 获取要出入的gmail账户的id
                String calId = "";
                Cursor userCursor = getContentResolver().query(Uri.parse(calanderURL), null, null, null, null);
                if (userCursor.getCount() > 0) {
                    userCursor.moveToLast();  //注意:是向最后一个账户添加,开发者可以根据需要改变添加事件 的账户
                    calId = userCursor.getString(userCursor.getColumnIndex("_id"));
                }
                else {
                    Toast.makeText(this, "没有账户,请先添加账户", 0).show();
                    return;
                }
                
                ContentValues event = new ContentValues();
                event.put("title", "与苍井空小姐动作交流");
                event.put("description", "Frankie受空姐邀请,今天晚上10点以后将在Sheraton动作交流.lol~");
                // 插入账户
                event.put("calendar_id", calId);
                System.out.println("calId: " + calId);
                event.put("eventLocation", "地球-华夏");   
                
                Calendar mCalendar = Calendar.getInstance();
                mCalendar.set(Calendar.HOUR_OF_DAY, 11);
                mCalendar.set(Calendar.MINUTE, 45);
                long start = mCalendar.getTime().getTime();
                mCalendar.set(Calendar.HOUR_OF_DAY, 12);
                long end = mCalendar.getTime().getTime();
    
                event.put("dtstart", start);
                event.put("dtend", end);
                event.put("hasAlarm", 1);
    
                event.put(Events.EVENT_TIMEZONE, "Asia/Shanghai");  //这个是时区,必须有,
                //添加事件
                Uri newEvent = getContentResolver().insert(Uri.parse(calanderEventURL), event);        
                //事件提醒的设定
                long id = Long.parseLong(newEvent.getLastPathSegment());
                ContentValues values = new ContentValues();
                values.put("event_id", id);
                // 提前10分钟有提醒
                values.put("minutes", 10);
                getContentResolver().insert(Uri.parse(calanderRemiderURL), values);
                
                Toast.makeText(MainActivity.this, "插入事件成功!!!", Toast.LENGTH_LONG).show();
            }
        }
        
    
        //添加账户
        private void initCalendars() {
    
            TimeZone timeZone = TimeZone.getDefault();
            ContentValues value = new ContentValues();
            value.put(Calendars.NAME, "yy");
    
            value.put(Calendars.ACCOUNT_NAME, "mygmailaddress@gmail.com");
            value.put(Calendars.ACCOUNT_TYPE, "com.android.exchange");
            value.put(Calendars.CALENDAR_DISPLAY_NAME, "mytt");
            value.put(Calendars.VISIBLE, 1);
            value.put(Calendars.CALENDAR_COLOR, -9206951);
            value.put(Calendars.CALENDAR_ACCESS_LEVEL, Calendars.CAL_ACCESS_OWNER);
            value.put(Calendars.SYNC_EVENTS, 1);
            value.put(Calendars.CALENDAR_TIME_ZONE, timeZone.getID());
            value.put(Calendars.OWNER_ACCOUNT, "mygmailaddress@gmail.com");
            value.put(Calendars.CAN_ORGANIZER_RESPOND, 0);
    
            Uri calendarUri = Calendars.CONTENT_URI;
            calendarUri = calendarUri.buildUpon()
                    .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
                    .appendQueryParameter(Calendars.ACCOUNT_NAME, "mygmailaddress@gmail.com")
                    .appendQueryParameter(Calendars.ACCOUNT_TYPE, "com.android.exchange")    
                    .build();
    
            getContentResolver().insert(calendarUri, value);
        }
        
        
    }

    运行结果:  

      

  • 相关阅读:
    PHP常用字符串函数
    PHP 中解析 url 并得到 url 参数
    PHP中的10个实用函数
    虚拟主机知识全解
    php三种常用的加密解密算法
    Javascript中的位运算符和技巧
    ECMAScript 5中新增的数组方法
    捕捉小括号获取的内容保存在RegExp的$1 $2..属性中
    js获取浏览器窗口的大小
    关于switch的思考和总结
  • 原文地址:https://www.cnblogs.com/wblyuyang/p/4050377.html
Copyright © 2020-2023  润新知