10

いくつかの Web サイトから取得したイベントでいっぱいになるように、自分のアカウントでカレンダーを作成しようとしています。必要なものを取得するために変更した新しい Android 4.0 カレンダーの例を検索して見つけました。問題は、カレンダーが作成され、イベントで満たされているが、Google カレンダーと同期されていないため、次の同期で消去されることです。私が使用する機能は次のとおりです。

これは、まだ存在しない場合に新しいカレンダーを追加するためのものです。

public static Uri createCalendarWithName(Context ctx, String name,String accountName) {

            Uri target = Uri.parse(CalendarContract.Calendars.CONTENT_URI.toString());
            target = target.buildUpon().appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
            .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, accountName)
            .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, "com.google").build();

            ContentValues values = new ContentValues();
            values.put(Calendars.ACCOUNT_NAME, accountName);
            values.put(Calendars.ACCOUNT_TYPE, "com.google");
            values.put(Calendars.NAME, name);
            values.put(Calendars.CALENDAR_DISPLAY_NAME, name);
            values.put(Calendars.CALENDAR_COLOR, 0x00FF00);
            values.put(Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_ROOT);
            values.put(Calendars.OWNER_ACCOUNT, accountName);
            values.put(Calendars.VISIBLE, 1);
            values.put(Calendars.SYNC_EVENTS, 1);
            values.put(Calendars.CALENDAR_TIME_ZONE, "Europe/Rome");
            values.put(Calendars.CAN_PARTIALLY_UPDATE, 1);
            values.put(Calendars.CAL_SYNC1, "https://www.google.com/calendar/feeds/" + accountName + "/private/full");
            values.put(Calendars.CAL_SYNC2, "https://www.google.com/calendar/feeds/default/allcalendars/full/" + accountName);
            values.put(Calendars.CAL_SYNC3, "https://www.google.com/calendar/feeds/default/allcalendars/full/" + accountName);
            values.put(Calendars.CAL_SYNC4, 1);
            values.put(Calendars.CAL_SYNC5, 0);
            values.put(Calendars.CAL_SYNC8, System.currentTimeMillis());

            Uri newCalendar = ctx.getContentResolver().insert(target, values);

            return newCalendar;
    }

そして、それは相互作用なしで新しいイベントを作成します:

public static Uri createEventWithName(Context ctx, long id, String name, String data) {
        long startMillis = 0; 
        long endMillis = 0;     
        int id2=(int)id;
        String[] divisi = data.split("/");
        Calendar beginTime = Calendar.getInstance();
        beginTime.set(2012,Integer.parseInt(divisi[0])-1, Integer.parseInt(divisi[1]));
        startMillis = beginTime.getTimeInMillis();
        Calendar endTime = Calendar.getInstance();
        endTime.set(2012,Integer.parseInt(divisi[0])-1, Integer.parseInt(divisi[1]));
        endMillis = endTime.getTimeInMillis();


        ContentValues cv = new ContentValues();
        cv.put(Events.TITLE, name);
        cv.put(Events.DTSTART, startMillis);
        cv.put(Events.DTEND, endMillis);
        cv.put(Events.CALENDAR_ID, id2);
        Log.d("aggiungo a calendario",Integer.toString(id2));
        cv.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().toString());
        //cv.put(Events.RRULE, "FREQ=DAILY;INTERVAL=2");

        Uri newEvent = ctx.getContentResolver().insert(CalendarContract.Events.CONTENT_URI, cv);
        return newEvent;
}

私は Android プログラミングの経験があまりないので、ばかげた質問だと思います =) accountName と Account Type は、Android デバイスに保存されているものと同じでなければならないことを読みました。そうでない場合、イベントはキャンセルされます。Android api から accountName を取得しましたが、正しいと思います。アカウントの種類は他のものでも機能するようです....

私を助けてくれてありがとう!

4

4 に答える 4

2

今のところ不可能です。

多くのグーグル検索の後、Gmail アカウント (アカウント タイプ「com.google」) で新しい同期可能なカレンダーを作成する方法が見つかりませんでした。私はこれらのシナリオを試しました:
1. SyncAdapter なしで、同じ動作が得られます - カレンダーは、追加したすべてのイベントと共に外部の Google カレンダー アプリに表示されますが、その直後 (たとえば、数秒後) にすべてのイベントとカレンダーが消えます。
2. SyncAdapter と com.google オーセンティケータを使用 - プロセス中にエラーが発生する
3. SyncAdapter と com.example オーセンティケータを使用 - カレンダーを作成できるが、Gmail アカウントでは作成できない

新しいアカウントを作成し、そのアカウント用に新しいカレンダーを作成することはできますが (SyncAdapter、シナリオ 3 を使用)、Gmail アカウントではないため、カレンダーは Gmail カレンダーと同期できません (たとえば、Web ブラウザーで Gmail アカウントにログインして Google カレンダーを開いた場合)。作成したばかりのカレンダーは表示されません)。

于 2013-11-01T19:46:06.117 に答える
2

私が直面していた同じ問題。以下の変更を行った後、イベントがカレンダーに永久に固執するようになりました。

メソッドにaddEvent以下の行を追加します

Uri uri =  getContentResolver().insert(asSyncAdapter(Events.CONTENT_URI,"abc@gmail.com","com.gmail"), cv);

asSyncAdapter のコードは次のとおりです。

 static Uri asSyncAdapter(Uri uri, String account, String accountType) {
        return uri.buildUpon()
            .appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true")
            .appendQueryParameter(Calendars.ACCOUNT_NAME, account)
            .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build();
     }
于 2014-12-19T15:29:20.697 に答える
1

CalendarContract.Calendars の Javadoc によると:

「カレンダーは主に同期アダプターによって管理されるように設計されており、新しいカレンダーの挿入は同期アダプターとして行う必要があります。」

あなたが同期アダプターでない場合 (あなたが単なる任意のアプリである場合、同期アダプターではありません)、新しいカレンダーが期待どおりに同期されない理由を説明できます。

于 2012-10-22T18:13:10.180 に答える