Android 내장 Calendar에서 일정 읽어 오기Android 내장 Calendar에서 일정 읽어 오기

Posted at 2011.02.01 11:55 | Posted in About Programing/05. Android
Google Calendar와 동기화 하는 방법을 찾다가 Java에서는 쉽게 구현 가능하지만,
Android와 Google Calendar API가 궁합이 맞지 않다는 것을 알고 우회하기로 하였다.

어차피 내장 Calendar는 Google Calendar와 자동으로 동기화가 되니,
내장 Calendar에서 값을 읽어 오기로 하였다.


// Main.java
package com.calendar;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class Main extends ListActivity {
    /** Called when the activity is first created. */
	
	ArrayAdapter mArrayAdapter;
	List mItems = new ArrayList();
	ListView mListView;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mListView = (ListView)findViewById(android.R.id.list);
        
        setCalendar();
    }
    
    public void setCalendar ()
	{
		Uri calendars = Uri.parse("content://com.android.calendar/events");
		
		String[] projection = new String[] {
				"calendar_id",
				"htmlUri",
				"title",
				"eventLocation",
				"description",
				"eventStatus",
				"selfAttendeeStatus",
				"commentsUri",
				"dtstart",
				"dtend",
				"eventTimezone",
				"duration",
				"allDay",
				"visibility",
				"transparency",
				"hasAlarm",
				"hasExtendedProperties",
				"rrule",
				"rdate",
				"exrule",
				"exdate",
				"originalEvent",
				"originalInstanceTime",
				"originalAllDay",
				"lastDate",
				"hasAttendeeData",
				"guestsCanModify",
				"guestsCanInviteOthers",
				"guestsCanSeeGuests",
				"organizer",
				"deleted"
		} ;
		Cursor managedCursor = getContentResolver().query(calendars, projection, "selected=1", null, null) ;

		if(managedCursor.moveToFirst()) {
			int[] calendar_id               = new int[managedCursor.getCount()];
			
			String[] htmlUri                = new String[managedCursor.getCount()];
			String[] title                  = new String[managedCursor.getCount()];
			String[] eventLocation          = new String[managedCursor.getCount()];
			String[] description            = new String[managedCursor.getCount()];
			int[] eventStatus               = new int[managedCursor.getCount()];
			int[] selfAttendeeStatus        = new int[managedCursor.getCount()];
			String[] commentsUri            = new String[managedCursor.getCount()];
			int[] dtstart                = new int[managedCursor.getCount()];
			int[] dtend                  = new int[managedCursor.getCount()];
			String[] eventTimezone          = new String[managedCursor.getCount()];
			String[] duration               = new String[managedCursor.getCount()];
			int[] allDay                    = new int[managedCursor.getCount()];
			int[] visibility                = new int[managedCursor.getCount()];
			int[] transparency              = new int[managedCursor.getCount()];
			int[] hasAlarm                  = new int[managedCursor.getCount()];
			int[] hasExtendedProperties     = new int[managedCursor.getCount()];
			String[] rrule                  = new String[managedCursor.getCount()];
			String[] rdate                  = new String[managedCursor.getCount()];
			String[] exrule                 = new String[managedCursor.getCount()];
			String[] exdate                 = new String[managedCursor.getCount()];
			String[] originalEvent          = new String[managedCursor.getCount()];
			int[] originalInstanceTime      = new int[managedCursor.getCount()];
			int[] originalAllDay            = new int[managedCursor.getCount()];
			int[] lastDate               = new int[managedCursor.getCount()];
			int[] hasAttendeeData           = new int[managedCursor.getCount()];
			int[] guestsCanModify           = new int[managedCursor.getCount()];
			int[] guestsCanInviteOthers     = new int[managedCursor.getCount()];
			int[] guestsCanSeeGuests        = new int[managedCursor.getCount()];
			String[] organizer              = new String[managedCursor.getCount()];
			int[] deleted                   = new int[managedCursor.getCount()];
			
			for (int i = 0 ; i < title.length ; i++) {
				calendar_id[i] = managedCursor.getInt(0);
				Log.i("Calendar", "ID : " + calendar_id[i]);
				htmlUri[i] = managedCursor.getString(1);
				Log.i("Calendar", "htmlUri : " + htmlUri[i]);
				title[i] = managedCursor.getString(2);
				Log.i("Calendar", "title : " + title[i]);
				eventLocation[i] = managedCursor.getString(3);
				Log.i("Calendar", "eventLocation : " + eventLocation[i]);
				description[i] = managedCursor.getString(4);
				eventStatus[i] = managedCursor.getInt(5);
				selfAttendeeStatus[i] = managedCursor.getInt(6);
				commentsUri[i] = managedCursor.getString(7);
				dtstart[i] = managedCursor.getInt(8);
				dtend[i] = managedCursor.getInt(9);
				eventTimezone[i] = managedCursor.getString(10);
				duration[i] = managedCursor.getString(11);
				allDay[i] = managedCursor.getInt(12);
				visibility[i] = managedCursor.getInt(13);
				transparency[i] = managedCursor.getInt(14);
				hasAlarm[i] = managedCursor.getInt(15);
				hasExtendedProperties[i] = managedCursor.getInt(16);
				rrule[i] = managedCursor.getString(17);
				rdate[i] = managedCursor.getString(18);
				exrule[i] = managedCursor.getString(19);
				exdate[i] = managedCursor.getString(20);
				originalEvent[i] = managedCursor.getString(21);
				originalInstanceTime[i] = managedCursor.getInt(22);
				originalAllDay[i] = managedCursor.getInt(23);
				lastDate[i] = managedCursor.getInt(24);
				hasAttendeeData[i] = managedCursor.getInt(25);
				guestsCanModify[i] = managedCursor.getInt(26);
				guestsCanInviteOthers[i] = managedCursor.getInt(27);
				guestsCanSeeGuests[i] = managedCursor.getInt(28);
				organizer[i] = managedCursor.getString(29);
				deleted[i] = managedCursor.getInt(30);
				
				if (title[i] != null)
				{
					mItems.add(title[i]);
				}
				
				managedCursor.moveToNext() ;
			}
			managedCursor.close();
			
			mArrayAdapter = new ArrayAdapter (this, android.R.layout.simple_list_item_1, mItems);
			mListView = (ListView)findViewById (android.R.id.list);
			mListView.setAdapter(mArrayAdapter);
			mListView.setItemsCanFocus(true);
		}
	}
}

마지막줄에 </string></string></string></string>이 자꾸 붙네요-_-
무시하세요.

// main.xml




    	



LISTVIEW 와 LINEARLAYOUT 이 모두 대문자로 적혀있는데, 수정이 안되네요-_-;;
ListView, LinearLayout 으로 수정해서 사용하시기 바랍니다.

// AndroidManifest.xml


    
        
            
                
                
            
        

    
    



 
저작자 표시 비영리 변경 금지
신고
  1. ibj2012
    안녕하세요.. 숙신님.
    "Android 내장 Calendar에서 일정 읽어 오기" 글을 보고 따라해보았습니다.
    그러나 실행이 잘 되지 않네요.. 답답하여서 질문 남깁니다.
    테스트환경은 안드로이드 2.2 갤럭시탭입니다.
    응용프로그램(android.calendar프로세스)이 예상치 않게 중지되었습니다. 다시 시도해주세요.
    라고 팝업창이 뜹니다.
    어떻게 해야할지 모르겠네요..
    바쁘시겠지만 잠시 조언 좀 부탁드리겠습니다.
    • 2011.05.16 10:33 신고 [Edit/Del]
      단순히 예상치 않게 중지 되었다는것만 알려주시면
      어디서 문제인지 잘 알수가 없습니다^^
      에러 Log 메세지나, 어느 시점에서 에러가 나는지에 대해서 말씀을 해 주셔야 정확한 답변을 드릴수 있을듯 합니다.
      지금 예상되는 바로는 Manifest 설정 문제 인것 같은데, 혹시 Permission이나 Activity 설정 올바르게 하셨는지 확인해보시겠어요?ㅎ
    • ibj2012
      2011.05.16 17:32 신고 [Edit/Del]
      문제를 해결하였습니다.
      원인은 대소문자 문제입니다. ㅠㅠ
      ListView를 LISTVIEW로 잘못적었네요..
      숙신님께서 Manifest쪽 문제인것같다고 하여서 그쪽으로 보다가 xml파일을 전부 확인해보니 main.xml파일에 대소문자를 잘못적었더군요.. 이런 기초적인 실수를 하다니 부끄럽습니다..ㅠㅠ
      질문을 올릴때 이렇게 빨리 답변을 해주실지 몰랐는데.. 너무 빠른 답글에 놀랐습니다. 감사드립니다.
      제가 안드로이드가 처음이여서 모르는 것이 많습니다. 다음에 또 잘 이해가 되지 않는 것들을 여쭤봐도 될런지요? ㅎㅎ
      항상 건강하시기바랍니다. ^^
    • 2011.05.16 18:13 신고 [Edit/Del]
      언제든지 환영합니다^^
      부족한 실력이지만 도움이 되었으면 좋겠네요^^
  2. ibj2012
    안녕하세요. 숙신님.
    또 질문이 있습니다.^^
    제가 지금 안드로이드폰에서 서버에 로그인을 해야되는데요..
    서버는 현재 정성 서비스중인 웹서버와 제가 임의로 구현한 소켓서버입니다. 소켓통신 테스트는 하였습니다.
    둘다 로그인 후 안드로이드에서 액티비티가 넘어가도 세션이 유지되어야되는데요.
    처음부터 제가 구현할 실력이 못되어서 책과 인터넷에서 참고할만한 예제 소스를 찾고 있지만 쉽지 않네요. 혹시 로그인을 구현해보신적이 있으시나요?
    참고할만한 예제가 있으시면 무지한 중생에게 도움을 부탁드리겠습니다.
    계속 질문만드려서 죄송합니다. 오늘도 즐거운 하루 보내세요..^^
    • 2011.05.18 10:54 신고 [Edit/Del]
      Login을 구현해 보았냐는 질문을
      Android에서 소켓통신 하는걸 구현해 보았냐는 질문으로 이해해도 될까요?^^
      아니면 Activity가 넘어가도 Login 상태가 유지되어야 하는데, 그 방법을 모르겠다는 질문인가요?ㅎ
    • ibj2012
      2011.05.18 13:06 신고 [Edit/Del]
      최종적으로 제가 구현하고자하는 것은 로그인입니다.
      첫번째로 정상적인 사이트에 로그인을 하여 해당 사이트에서 로그인하였을때 제공받는 정보들을 안드로이드에서 조회하고 싶습니다.
      두번째로 제가 디비를 외부에 구성해놓고, 중간에 소켓서버를 열어두고 안드로이드가 소켓통신으로 서버와 통신하여 서버가 외부 디비로 쿼리를 조회하도록 하는 것인데요. 이때 로그인을하여서 사용자마다 다른 테이블을 조회하려고 합니다.
      그리고 Activity가 넘어가도 로그인 상태가 유지되도록 하여야 하는것도 물론 필요합니다.
    • 2011.05.18 20:37 신고 [Edit/Del]
      사이트에 로그인 하였을 때 제공받는 정보들을 얻고 싶으시다면, [HTML 파싱]이나 [XML 파싱]을 키워드로 검색해 보시기 바랍니다.
      두번째 질문은 소켓통신이 된다면 당연히 구현이 되는 사항인데 어느 부분에서 막히셨는지 잘 모르겠네요^^ 소켓 통신이 된다면 두번째에서 질문하신 모든 내용이 다 가능합니다^^ 혹시 Packet 설계는 하셨나요?
  3. 윤지용
    안녕하세요. 안드로이드에서 구글캘린더를 연동시키는 어플을 구현하려고 이리저리 찾아보던 도중 이 블로그를 발견하게된 학생입니다.

    제가 만들고자 하는건 읽어오는게 아니라 캘린더에 새로운 일정을 등록하고자 하는데요. 어떤식으로 하면 될지 좀 여쭤보고 싶네요.

    예를들어 addschedule("연도", "월", "일", "내용") 이런식으로 함수를 호출하면
    구글캘린더에 등록하는 식으로 말이죠.
    • 2011.05.19 10:37 신고 [Edit/Del]
      Google에서 Calendar와 연동하는
      Java 소스를 제공해주고 있습니다.

      하지만, Android에서는 Java의 모든 API를 제공하지 않습니다.

      저도 일정 등록을 해보려고 시도 하다가
      Google에서 제공해주는 Java API가 Android에서는
      제공하지 않아서 구현하지 못했었습니다^^

      물론 방법은 있겠지만, 제가 답변 드릴수 있는
      부분은 없는것 같네요^^

      도움이 되지 못해서 죄송합니다.
  4. 순삭!
    숙신님 안녕하세요
    저소스로 한번 돌려볼려고 긁어서 돌려보았는데 mItems.add(title[i]); 이부분에서 add가 에러가 납니다.왜그럴까요?
    • 2011.07.16 21:01 신고 [Edit/Del]
      ArrayAdapter<STRING> mArrayAdapter;
      List<STRING> mItems = new ArrayList<STRING>();



      ArrayAdapter<String> mArrayAdapter;
      List<String> mItems = new ArrayList<String>();

      으로 바꿔보세요.
      그래도 안되면 로그캣 참조하세요^^
  5. 순삭!
    에뮬레이터에서 아이콘까지 만들어지는데 예상치 못하게 중지되었다고 나오네요;; 왜그런 걸까요..ㅠㅠ
  6. dtstart와 dtend는
    long 형으로 받아야 합니다 흑흑....
    timestamp가 짤리는...
  7. 비밀댓글입니다
  8. 비밀댓글입니다
  9. 힝..
    안녕하세요, 다이어리 일정을 가져오는 코드를 보고 가져와 써보려 하는데요..
    여러 에러들을 수정하고 하고,, 한 결과..
    moveToFirst 이쪽 널포인트익셉션이 발생하네요.. 왜그런가요?

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

티스토리 툴바