Android: как получить все доступные календари с мобильного

К сожалению, я не смог найти никакой помощи по этому поводу.

На самом деле я хочу получить список всех доступных календарей (может быть предпочтений календаря) с мобильного телефона, например, календарь Google, календарь Yahoo.

Для лучшего объяснения я захватил некоторые изображения из приложения Smooth Calendar, которое находится на изображении ниже после нажатия кнопки конфигурации из виджета.

==>

Здесь предпочтение Календари показывает все календари, доступные в телефоне, и после выбора опции Календари показывает все календари, чтобы выбрать то, что хочет пользователь.

Может кто-то мне здесь поможет и поделится некоторыми знаниями о том, как это сделать.

Спасибо

2 ответа

Решение

К счастью, я нашел некоторую помощь на сайте разработчика и смог получить все доступные календари и показать их с динамическими контрольными настройками.

надеюсь, что мой код поможет кому-то в будущем.

CalendarPreference.java

public class CalendarPreference extends PreferenceActivity{
private static final String CALENDAR_ID = "calendarId";
private static final String[] PROJECTION = new String[] { Calendars._ID,
        Calendars.CALENDAR_DISPLAY_NAME, Calendars.CALENDAR_COLOR };
private Set<String> initialActiveCalendars;

CheckBoxPreference mCheckBoxPreference;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.calendaraccounts);
    SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
    initialActiveCalendars = prefs.getStringSet("PREF_ACTIVE_CALENDARS", null);
    populatePreferenceScreen(initialActiveCalendars);


}

private void populatePreferenceScreen(Set<String> activeCalendars) {
    Cursor cursor = createLoadedCursor();
    if (cursor == null) {
        return;
    }
    for (int i = 0; i < cursor.getCount(); i++) {
        cursor.moveToPosition(i);
        CheckBoxPreference checkboxPref = new CheckBoxPreference(this);
        checkboxPref.setTitle(cursor.getString(1));
        checkboxPref.setIcon(createDrawable(cursor.getInt(2)));
        int calendarId = cursor.getInt(0);
        checkboxPref.getExtras().putInt(CALENDAR_ID, calendarId);
        checkboxPref.setChecked(activeCalendars == null
                || activeCalendars.contains(String.valueOf(calendarId)));
        getPreferenceScreen().addPreference(checkboxPref);
    }
}

    @Override
       public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        return true;
    }


    private Cursor createLoadedCursor() {
    Uri.Builder builder = Calendars.CONTENT_URI.buildUpon();
    ContentResolver contentResolver = getContentResolver();
    return contentResolver.query(builder.build(), PROJECTION, null, null, null);
   }

    @Override
    public void onPause() {
        super.onPause();        
        HashSet<String> selectedCalendars = getSelectedCalenders();  
        if (!selectedCalendars.equals(initialActiveCalendars)) {
            persistSelectedCalendars(selectedCalendars);
            Log.v("Selected Calendars", selectedCalendars.toString());
            NewWidget.updateAllWidgets(this);
        }
    }

    private void persistSelectedCalendars(HashSet<String> prefValues) {
        SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
        Editor editor = prefs.edit();
        editor.putStringSet("PREF_ACTIVE_CALENDARS", prefValues);
        editor.commit();
    }

    private HashSet<String> getSelectedCalenders() {
        PreferenceScreen preferenceScreen = getPreferenceScreen();
        int prefCount = preferenceScreen.getPreferenceCount();
        HashSet<String> prefValues = new HashSet<String>();
        for (int i = 0; i < prefCount; i++) {
            Preference pref = preferenceScreen.getPreference(i);
            if (pref instanceof CheckBoxPreference) {
                CheckBoxPreference checkPref = (CheckBoxPreference) pref;
                if (checkPref.isChecked()) {
                    prefValues.add(String.valueOf(checkPref.getExtras().getInt(CALENDAR_ID)));
                }
            }
        }
        return prefValues;
    }

    private Drawable createDrawable(int color) {
        Drawable drawable = getResources().getDrawable(R.drawable.prefs_calendar_entry);
        drawable.setColorFilter(new LightingColorFilter(0x0, color));
        return drawable;
    }


}

А вот res/xml/calendaraccounts.xml

<PreferenceScreen>

</PreferenceScreen>

Чтобы получить все доступные календари с мобильного, надеюсь, этот код поможет.

Cursor cursor;

        if (android.os.Build.VERSION.SDK_INT <= 7) {
            cursor = getContentResolver().query(Uri.parse("content://calendar/calendars"), new String[] { "_id", "displayName" }, null,
                    null, null);

        }

        else if (android.os.Build.VERSION.SDK_INT <= 14) {
            cursor = getContentResolver().query(Uri.parse("content://com.android.calendar/calendars"),
                    new String[] { "_id", "displayName" }, null, null, null);

        }

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

        }

        // Get calendars name
        Log.i("@calendar","Cursor count " + cursor.getCount());
        if (cursor.getCount() > 0) {
            cursor.moveToFirst();
            String[] calendarNames = new String[cursor.getCount()];
            // Get calendars id
            int calendarIds[] = new int[cursor.getCount()];
            for (int i = 0; i < cursor.getCount(); i++) {
                calendarIds[i] = cursor.getInt(0);
                calendarNames[i] = cursor.getString(1);
                Log.i("@calendar","Calendar Name : " + calendarNames[i]);
                cursor.moveToNext();
            }
        } else {
            Log.e("@calendar","No calendar found in the device");
        }
Другие вопросы по тегам