3

インテントを起動せずにカレンダーにイベントを追加できるAndroidアプリでボタンを作成しようとしています。

これを実現する方法を説明するこの公式Androidリソースを見つけました。

long calID = 3;
long startMillis = 0; 
long endMillis = 0;     
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 9, 14, 7, 30);
startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 9, 14, 8, 45);
endMillis = endTime.getTimeInMillis();
...

ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Events.DTSTART, startMillis);
values.put(Events.DTEND, endMillis);
values.put(Events.TITLE, "Jazzercise");
values.put(Events.DESCRIPTION, "Group workout");
values.put(Events.CALENDAR_ID, calID);
values.put(Events.EVENT_TIMEZONE, "America/Los_Angeles");
Uri uri = cr.insert(Events.CONTENT_URI, values);

このコードは、2.3、4.0、4.1、4.2などの多くのデバイスでテストしました。

これは4.1デバイスでは機能しないようです。このコードを使用してカレンダーイベントを追加しようとしましたが、役に立ちませんでした。他の誰かが4.1でこのバグを確認できますか?または、カレンダーイベントを4.1に追加するための回避策はありますか?

4

1 に答える 1

0

私も同じ問題を抱えていました。

ドキュメントでは、次を読むことができます:

実際には、挿入と更新は非同期スレッドで実行して、アクションをバックグラウンド スレッドに移動する必要があります。

コードの最後の行を削除して、これを使用します。

AsyncQueryHandler handler = new MyHandler(getContentResolver());
handler.startInsert(0, null, Events.CONTENT_URI, values);

どこMyHandlerで拡張するクラスですAsyncQueryHandler(つまり、抽象です):

public class MyHandler extends AsyncQueryHandler {
    public MyHandler(ContentResolver cr) {
        super(cr);
    }
}

これは私にとってはうまくいきます。

誤解を招く可能性のあるその他の 2 つの詳細:

  • クラスではCalendar、月の値は 0 ベースです
  • インテントなしでカレンダーを書き込むには、特定の権限をマニフェスト ファイルに入れる必要があります。<uses-permission android:name="android.permission.WRITE_CALENDAR" />
于 2013-11-15T16:54:46.583 に答える