2012-04-28 58 views
3

嗨我想添加事件到Android日历。我是android开发新手。请帮助我如何添加事件到Android日历。这是我的代码不起作用。当我运行它时,它给了我一个消息“应用程序日历(process com.something.something)已经意外停止”并且具有“强制停止”这个按钮。这里是我的代码使用java添加安卓日历事件

package com.zafar.calendar; 

import android.app.Activity; 
import android.content.ContentValues; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 

public class Calendar extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Cursor cursor=getContentResolver().query(Uri.parse("content://com.android.calendar/calendars"), new String[]{"_id", "displayname"}, null, null, null); 

    cursor.moveToFirst(); 
    // Get calendars name 
    String calendarNames[] = new String[cursor.getCount()]; 
    // Get calendars id 
    int[] calendarId = new int[cursor.getCount()]; 
    for (int i = 0; i < calendarNames.length; i++) 
    { 
      calendarId[i] = cursor.getInt(0); 
      calendarNames[i] = cursor.getString(1); 
      cursor.moveToNext(); 
    } 
    cursor.close(); 

    ContentValues contentEvent = new ContentValues(); 
    contentEvent.put("calendar_id", 1); 
    contentEvent.put("title", "Wedding"); 
    contentEvent.put("eventLocation", "New York"); 
    contentEvent.put("dtstart","1335432431000"); 
    contentEvent.put("dtend","1335436031000"); 

    Uri eventsUri = Uri.parse("content://com.android.calendar/events"); 
    getContentResolver().insert(eventsUri, contentEvent); 

} 
} 

更新 这里是我的menifest文件

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:name=".Calendar" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <uses-permission android:name="android.permission.READ_CALENDAR"></uses-permission> 
    <uses-permission android:name="android.permission.WRITE_CALENDAR"></uses-permission> 
</application> 

logcat的

我是新android开发。我完全不知道logcat。我跑在命令提示符下的logcat条命令,我在你的代码得到这个

04-28 09:16:57.956: D/AndroidRuntime(333): Shutting down VM 
04-28 09:16:57.956: W/dalvikvm(333): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
04-28 09:16:57.975: E/AndroidRuntime(333): FATAL EXCEPTION: main 
04-28 09:16:57.975: E/AndroidRuntime(333): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.zafar.calendar/com.zafar.calendar.Calendar}: java.lang.NullPointerException 
04-28 09:16:57.975: E/AndroidRuntime(333): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
04-28 09:16:57.975: E/AndroidRuntime(333): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
04-28 09:16:57.975: E/AndroidRuntime(333): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
04-28 09:16:57.975: E/AndroidRuntime(333): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
04-28 09:16:57.975: E/AndroidRuntime(333): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-28 09:16:57.975: E/AndroidRuntime(333): at android.os.Looper.loop(Looper.java:123) 
04-28 09:16:57.975: E/AndroidRuntime(333): at android.app.ActivityThread.main(ActivityThread.java:3683) 
04-28 09:16:57.975: E/AndroidRuntime(333): at java.lang.reflect.Method.invokeNative(Native Method) 
04-28 09:16:57.975: E/AndroidRuntime(333): at java.lang.reflect.Method.invoke(Method.java:507) 
04-28 09:16:57.975: E/AndroidRuntime(333): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-28 09:16:57.975: E/AndroidRuntime(333): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-28 09:16:57.975: E/AndroidRuntime(333): at dalvik.system.NativeStart.main(Native Method) 
04-28 09:16:57.975: E/AndroidRuntime(333): Caused by: java.lang.NullPointerException 
04-28 09:16:57.975: E/AndroidRuntime(333): at com.zafar.calendar.Calendar.onCreate(Calendar.java:51) 
04-28 09:16:57.975: E/AndroidRuntime(333): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
04-28 09:16:57.975: E/AndroidRuntime(333): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
04-28 09:16:57.975: E/AndroidRuntime(333): ... 11 more 
04-28 09:21:58.095: I/Process(333): Sending signal. PID: 333 SIG: 9 
+0

你给了'' '' – 2012-04-28 08:37:11

+0

是的,我使用权限,你现在可以看到这个清单文件了,怎么解决这个问题? – 2619 2012-04-28 08:39:49

+0

Uri.parse(”content://com.android.calendar/calendar“)更改为Uri.parse(”content://com.android.calendar/Calendars“) – 2012-04-28 08:41:41

回答

3

错误:

  1. new String[]{"calendar_id", "displayname"}, null, null, null);

没有列上存在名称CALENDAR_ID在日历数据库。正确的是_id not calendar_id。所以它会是新的String [] {“_id”,“displayname”},null,null,null);

请参阅此参考。 https://stackoverflow.com/a/10310258http://android.arnodenhond.com/tutorials/calendar

EDIT

为了插入新的事件,则需要3个值。 Calendar_id,EventStartTime和EventEndTime。没有这些值,你不能插入新事件。 EventStartTime和EventEndTime需要时代格式。

对于正常日期划时代日期:https://stackoverflow.com/a/6687502/1160207
对于划时代正常日期:https://stackoverflow.com/a/10028980/1160207

这里是一个完美的工作,我的代码。

Cursor cursor=getContentResolver().query(Uri.parse("content://com.android.calendar/calendars"), new String[]{"_id", "displayname"}, null, null, null); 

cursor.moveToFirst(); 
// Get calendars name 
String calendarNames[] = new String[cursor.getCount()]; 
// Get calendars id 
int[] calendarId = new int[cursor.getCount()]; 
for (int i = 0; i < calendarNames.length; i++) 
{ 
     calendarId[i] = cursor.getInt(0); 
     calendarNames[i] = cursor.getString(1); 
     cursor.moveToNext(); 
} 
cursor.close(); 

ContentValues contentEvent = new ContentValues(); 
contentEvent.put("calendar_id", 1); 
contentEvent.put("title", "Wedding"); 
contentEvent.put("eventLocation", "New York");     
contentEvent.put("dtstart","1335432431000"); 
contentEvent.put("dtend","1335436031000"); 


Uri eventsUri = Uri.parse("content://com.android.calendar/events"); 
getContentResolver().insert(eventsUri, contentEvent); 

希望这会对你有帮助。如果它对您有帮助,请不要忘记接受它。

谢谢...

+0

我跟着你的两个参考文件,但它仍然是同样的错误,我也将calender_id更改为_id,但它没有解决问题。 – 2619 2012-04-28 09:08:12

+0

po st你的logcat – 2012-04-28 09:12:39

+0

这是什么logcat是? – 2619 2012-04-28 09:27:16

0

如果有要与整合,联系他们的开发人员,并确定他们是否提供了一个API特定的日历应用程序。因此,例如,Mayra引用的来自Android开放源代码项目的日历应用程序不提供记录和支持的API。 Google甚至明确告诉开发者不要使用Mayra引用的教程中概述的技术。

另一种选择是让您将事件添加到Internet日历中。例如,将事件添加到Android开放源代码项目的日历应用程序的最佳方式是通过相应的GData API将事件添加到用户的Google日历。