3

プログラムでユーザーのカレンダーにイベントを追加しようとしています。私は StackOverflow やその他の場所で数え切れないほどのガイドに従ってきましたが、どれもその忌まわしいイベントを私のカレンダーに表示させることはありません. これが私の現在のコードです:

public void saveGamesToCalendar() {
    showCalendarPopup();
}

private void showCalendarPopup() {
    final ContentResolver cr;
    final Cursor result;
    final Uri uri;
    List<String> listCals = new ArrayList<String>();
    final String[] projection = new String[] {CalendarContract.Calendars._ID, CalendarContract.Calendars.ACCOUNT_NAME, CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, CalendarContract.Calendars.NAME,};

    uri = CalendarContract.Calendars.CONTENT_URI;

    cr = context.getContentResolver();
    result = cr.query(uri, projection, null, null, null);
    if(result.getCount() > 0 && result.moveToFirst()) {
        do {
                listCals.add(result.getString(result.getColumnIndex(CalendarContract.Calendars.NAME)));
    } while(result.moveToNext());
}
CharSequence[] calendars = listCals.toArray(new CharSequence[listCals.size()]);

AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Calendar to use:");
builder.setItems(calendars, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog,int itemCal) {
            Log.e("SettingsActivity", "CalendarID: " + itemCal);
            loopThroughGames(itemCal);
        };
    });
    AlertDialog alert = builder.create();
    alert.show();
}

private void loopThroughGames(int whichCalendar) {
    ArrayList<Model_Game> games = memoryManager.getGames();

    // for(Game e: games)
    Log.e("Game", games.get(101).toString());
    addGameToCalendar(games.get(101), whichCalendar);

    Log.e("ID", "" + whichCalendar);
}

private void addGameToCalendar(Model_Game game,int whichCalendar) {
    ContentResolver cr = context.getContentResolver();
    ContentValues values = new ContentValues();

    try {
        values.put(CalendarContract.Events.CALENDAR_ID, whichCalendar);
        values.put(CalendarContract.Events.TITLE, "Hockey- " + game.getLeague() + ": " + game.getTeamH() + " vs " + game.getTeamA());
        values.put(CalendarContract.Events.EVENT_LOCATION, "Twin Rinks Ice Arena- " + game.getRink() + " Rink");
        values.put(CalendarContract.Events.DTSTART, "" + game.getCalendarObject().getTimeInMillis());
        //values.put(CalendarContract.Events.DTEND, "" + game.getCalendarObject().getTimeInMillis() + 5400000);
        values.put(CalendarContract.Events.DURATION, "" + 5400000);
        values.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());

        cr.insert(CalendarContract.Events.CONTENT_URI, values);
    } catch(Exception e) {
        Log.e("Error", e.getMessage());
        toast(e.getMessage());
    }
}

基本的に何が起こっているかというと、ユーザーがアクション バー ボタンを押すと、saveGamesToCalendar()メソッドが呼び出され、メソッドが呼び出されますShowCalendarPopup()。このメソッドは、ユーザーのカレンダーのリストを含む標準のダイアログを表示します。ユーザーがそのうちの 1 つを選択するとloopThroughGames()、選択したカレンダーの ID をパラメーターとしてメソッドが呼び出されます。このメソッドは、すべてが機能している場合、すべてのユーザーのゲームをカレンダーに書き込みますが、テスト目的で 1 つだけ書き込みます。このaddGameToCalendar()メソッドは、時間、タイトル、場所、日付などの多くの値を保持するゲーム オブジェクトを取得し、Web 上のさまざまな場所で概説されている標準的な方法を使用してカレンダーに挿入します。

このコードでエラー メッセージが表示されない (自分でエラー ログに送信したものを除く) ため、このコードが機能しない理由がわかりません。エラーはありません。ゲームだけがカレンダーに表示されません。マニフェストでアクセス許可が正しく設定されているので、それが問題ではないことがわかります。

この厄介な問題を解決できる人はいますか? ご協力いただきありがとうございます!

4

3 に答える 3

7

[再編集]]これは私がやったことであり、魅力のように機能します..

         Cursor cursor = null ;

         String[] projection = new String[] {
                   CalendarContract.Calendars._ID,
                   CalendarContract.Calendars.ACCOUNT_NAME,};

         ContentResolver cr = context2.getContentResolver();
         cursor = cr.query(Uri.parse("content://com.android.calendar/calendars"), projection, null, null, null);

         if ( cursor.moveToFirst() ) {
                final String[] calNames = new String[cursor.getCount()];
                calIds = new int[cursor.getCount()];
                for (int i = 0; i < calNames.length; i++) {
                    calIds[i] = cursor.getInt(0);
                    calNames[i] = cursor.getString(1);
                    cursor.moveToNext();
                }
            }

        try {           

            ContentValues values = new ContentValues();

//          int apiLevel = android.os.Build.VERSION.SDK_INT;
//            if(apiLevel<14){
//              values.put("visibility", 0);
//
//            }
            values.put(Events.DTSTART, stTime);
            values.put(Events.DTEND, enTime);
            values.put(Events.TITLE, category);
            values.put(Events.DESCRIPTION, description);
            values.put(Events.CALENDAR_ID, calIds[0]);
            values.put(Events.EVENT_LOCATION,place);
            values.put(Events.EVENT_TIMEZONE,tZone);

            mInsert =  cr.insert(CalendarContract.Events.CONTENT_URI, values);

            Toast.makeText(context2, "Event added Successfully",
                    Toast.LENGTH_LONG).show();

        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(context2, "Exception: " + e.getMessage(),
                    Toast.LENGTH_SHORT).show();
        }
于 2013-03-27T08:07:29.567 に答える
-2

これは機能し、理解がはるかに簡単です。

     long startTime = calSet.getTimeInMillis();
           Intent intent = new Intent(Intent.ACTION_INSERT).setData(Events.CONTENT_URI)
                 .setData(Events.CONTENT_URI)
                .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startTime)
            .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, startTime + (length*3600000))
                .putExtra(Events.TITLE, examName)
                .putExtra(Events.EVENT_LOCATION, venue)
                .putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY)
                .putExtra(Events.HAS_ALARM, 1);

                 startActivity(intent);
于 2014-01-31T03:35:05.467 に答える