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);
    }
    
    
}

 

運行結果:  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM