2012-03-02 51 views
1

實際上,我創建了一個應用程序,它將事件存儲在設備日曆中,並且其工作正常,並將事件存儲在設備日曆中。但是當我嘗試在ICE CREAM SANDWICH中做同樣的事情時,它會使應用程序崩潰,爲什麼會發生這種情況。任何人都可以幫我解決這個問題。我用來保存下面顯示的設備日曆中的事件的代碼,以及崩潰的日誌貓也在那裏。在冰淇淋三明治中運行應用程序時發生崩潰

代碼保存事件設備的日曆

public boolean setAlertOnDevice(Context c) 
{     
Resources res = c.getResources(); 

Uri EVENTS_URI = Uri.parse("content://com.android.calendar/" + "events"); 

Uri REMINDERS_URI = Uri.parse("content://com.android.calendar/" + "reminders"); 

    ContentResolver cr = c.getContentResolver(); 

Date dtStartDate = getStartDate(); 

Calendar cal = Calendar.getInstance(); 

cal.setTime(dtStartDate); 
cal.add(Calendar.DATE, m_iStart); 

cal.set(Calendar.HOUR_OF_DAY, 8); 
cal.set(Calendar.MINUTE, DEFAULT_TIME_OF_DATE);  
cal.set(Calendar.SECOND, DEFAULT_TIME_OF_DATE); 
cal.set(Calendar.MILLISECOND, DEFAULT_TIME_OF_DATE); 

String str = m_reminderText + res.getString(R.string.alert_start);           
m_strDescription = res.getString(R.string.alert_start_msg); 

ContentValues values = new ContentValues(); 
values.put("calendar_id", 1); 
values.put("title", str); 
values.put("description", m_strDescription);      
values.put("dtstart", cal.getTimeInMillis()); 
values.put("dtend", cal.getTimeInMillis()); 
values.put("hasAlarm", 1); 
Uri event = cr.insert(EVENTS_URI, values); 

m_calendarEvents[m_calendarEventCount] = event; 
m_calendarEventCount = m_calendarEventCount + 1; 

values = new ContentValues(); 
values.put("event_id", Long.parseLong(event.getLastPathSegment())); 
values.put("method", 1); 
values.put("minutes", 10); 
cr.insert(REMINDERS_URI, values); 
} 

登錄貓報告

03-02 18:28:35.836: E/AndroidRuntime(1362): FATAL EXCEPTION: main 
03-02 18:28:35.836: E/AndroidRuntime(1362): java.lang.RuntimeException: Unable to pause   activity {in.plackal.lovecyclesfree/in.plackal.lovecyclesfree.ActivityManager}: java.lang.IllegalArgumentException: Event values must include an eventTimezone 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2706) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2662) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2640) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at android.app.ActivityThread.access$800(ActivityThread.java:123) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at android.os.Looper.loop(Looper.java:137) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at dalvik.system.NativeStart.main(Native Method) 
03-02 18:28:35.836: E/AndroidRuntime(1362): Caused by: java.lang.IllegalArgumentException: Event values must include an eventTimezone 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at android.content.ContentProviderProxy.insert(ContentProviderNative.java:415) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at android.content.ContentResolver.insert(ContentResolver.java:730) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at in.plackal.lovecyclesfree.CycleManager.setAlertOnDevice(CycleManager.java:1083) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at in.plackal.lovecyclesfree.ActivityManager.onPause(ActivityManager.java:83) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at android.app.Activity.performPause(Activity.java:4563) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1195) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2693) 
03-02 18:28:35.836: E/AndroidRuntime(1362):  ... 12 more 
+2

這就是爲什麼你不使用未公開的API。他們可能會隨時更改,恕不另行通知。幸運的是,它已經被官方API取代。請參閱[本文](http://android-developers.blogspot.com/2011/10/ics-and-non-public-apis.html),日曆部分。 – 2012-03-02 13:09:48

+0

我該如何解決這個問題..你可以解釋我.. – AndroidDev 2012-03-02 13:14:29

+0

Alextsc ...我已經創建了我的應用程序使用api級別8.所以我的問題是這個CalendarContract是否應該在我的代碼 – AndroidDev 2012-03-02 14:02:24

回答

1

alextsc是正確的。您在這裏使用的是未公開的API,這些API是不支持的,並且因爲冰淇淋三明治而被破壞。閱讀他鏈接到的blog post,然後研究使用CalendarContract API來製作冰淇淋三明治。

+0

工作我經歷,但不能理解...在哪裏我應該得到的API和如何實現它在我的代碼 – AndroidDev 2012-03-02 13:22:13

+0

我可以嘗試在我的代碼中使用CalendarContract類,但它顯示error..class沒有找到 – AndroidDev 2012-03-02 13:33:38

+0

它只適用於冰淇淋三明治。正如他們在博客文章中所說的,您需要使用[http://android-developers.blogspot.com/2009/04/backward-compatibility-for-android.html](reflection)或[http:// android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too.html](lazy loading)來確定在你的應用中使用哪些代碼。你會選擇舊版本的舊代碼和冰淇淋三明治的CalendarContract。 – Calvin 2012-03-02 14:45:53

2

我也遇到這個問題,現在我解決它。您想要在ICE CREAM SANDWICH之上正常工作的代碼,您需要設置eventTimezone的值。那麼,只需要添加代碼,如

ContentValues values = new ContentValues(); 
values.put("calendar_id", 1); 
values.put("title", str); 
values.put("description", m_strDescription);      
values.put("dtstart", cal.getTimeInMillis()); 
values.put("dtend", cal.getTimeInMillis()); 
values.put("hasAlarm", 1); 

values.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID()); //add this row 

Uri event = cr.insert(EVENTS_URI, values); 
相關問題