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");
}