2017-02-15 1 views
0

J'écris une application pour Android qui crée une série d'événements dans un calendrier pour l'utilisateur où la récurrence normale ne peut tout simplement pas le gérer. Je souhaite autoriser l'utilisateur à choisir le compte qu'il souhaite utiliser pour le calendrier (principalement pour le partage ultérieur du calendrier). En utilisant AccountManager, je peux obtenir tous les comptes, mais pas tous les calendriers. Les comptes Google fonctionneraient techniquement, mais je veux utiliser des comptes Exchange ou d'autres qui ont également des calendriers. Tous les documents de l'API AccountManager que j'ai lus indiquent que les fonctionnalités à rechercher sont spécifiques à l'authentificateur (et peuvent changer). Garder une liste de ceux-ci serait presque impossible. Limiter à une liste de types de compte connus est plus limitant que je le veux vraiment.Comment obtenez-vous une liste de comptes sur Android qui ont des calendriers?

Y a-t-il d'autres options que j'ai ratées?

+0

Voulez-vous créer un nouveau calendrier dans le compte ou voulez-vous écrire dans un existant? – Marten

+0

Pour l'instant, écrire dans un existant. Finalement, je peux ajouter l'option pour en créer un. – Jason

+0

En outre, j'ai démarré une ligne de code pour énumérer les calendriers existants et les associer aux comptes. Je posterai le code dans une réponse s'il est affiché. – Jason

Répondre

0

Contrairement à mes croyances initiales, vous n'avez pas du tout besoin de toucher à la liste de comptes. Cela a été utile pour simplifier le processus et réduire le nombre d'autorisations requises. En utilisant the information from this page (sous Requête d'un calendrier), vous pouvez écrire une requête dans la table des calendriers et obtenir une liste complète des calendriers et du compte auquel ils appartiennent. En fin de compte, cette approche va être beaucoup plus utile pour moi. Fondamentalement, le EVENT_PROJECTION est changé comme ci-dessous de ce que l'exemple montre.

public static final String[] EVENT_PROJECTION = new String[] { 
    Calendars._ID, 
    Calendars.ACCOUNT_NAME, 
    Calendars.CALENDAR_DISPLAY_NAME, 
    Calendars.ACCOUNT_TYPE, 
    Calendars.CALENDAR_ACCESS_LEVEL, 
    Calendars.IS_PRIMARY 
}; 

ACCOUNT_TYPE, CALENDAR_ACCESS_LEVEL et IS_PRIMARY ont été ajoutés afin que nous sachions a) quel calendrier est primaire pour le compte pour le tri plus tard, et b) si l'utilisateur peut effectivement écrire ou de ne pas le , parce que nous ne le voulons pas si c'est en lecture seule.

En outre, dans la requête réelle de la table des calendriers, j'ai apporté les modifications suivantes.

// Run query 
Cursor cur = null; 
ContentResolver cr = getContentResolver(); 
Uri uri = Calendars.CONTENT_URI; 
// Submit the query and get a Cursor object back. 
cur = cr.query(uri, EVENT_PROJECTION, "", null, null); 

Puisque nous voulons tous les calendriers pour commencer, les sélection et selectionArgs variables dans l'exemple sont inutiles. Jusqu'à ce que nous obtenions le résultat final de la requête, fondamentalement tout le reste dans l'exemple reste le même.

Une fois que nous avons les données, il peut être analysé et mis en Liste, HashMap, etc. triées et filtrées selon les besoins.

0

modèles

import java.util.ArrayList; 
import java.util.List; 

public class CalendarAccount { 

    private String name; 
    private List<Calendar> calendars; 

    public CalendarAccount(String name) { 
     this(name, new ArrayList<Calendar>()); 
    } 

    public CalendarAccount(String name, List<Calendar> calendars) { 
     this.name = name; 
     this.calendars = calendars; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public List<Calendar> getCalendars() { 
     return calendars; 
    } 

    public void setCalendars(List<Calendar> calendars) { 
     this.calendars = calendars; 
    } 
} 

import android.support.annotation.ColorInt; 

public class Calendar { 

    private long id; 
    private String displayName; 
    @ColorInt private int color; 
    private boolean userActivated; 

    public Calendar(long id, String displayName, @ColorInt int color) { 
     this(id, displayName, color, false); 
    } 

    public Calendar(long id, String displayName, int color, boolean userActivated) { 
     this.id = id; 
     this.displayName = displayName; 
     this.color = color; 
     this.userActivated = userActivated; 
    } 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getDisplayName() { 
     return displayName; 
    } 

    public void setDisplayName(String displayName) { 
     this.displayName = displayName; 
    } 

    public int getColor() { 
     return color; 
    } 

    public void setColor(int color) { 
     this.color = color; 
    } 

    public boolean isUserActivated() { 
     return userActivated; 
    } 

    public void setUserActivated(boolean userActivated) { 
     this.userActivated = userActivated; 
    } 
} 

code réel en utilisant le fournisseur Calendrier

public static final String[] EVENT_PROJECTION = new String[] { 
     Calendars._ID,       // 0 
     Calendars.ACCOUNT_NAME,     // 1 
     Calendars.CALENDAR_DISPLAY_NAME,   // 2 
     Calendars.OWNER_ACCOUNT,     // 3 
     Calendars.CALENDAR_COLOR     // 4 
}; 

// The indices for the projection array above. 
private static final int PROJECTION_ID_INDEX = 0; 
private static final int PROJECTION_ACCOUNT_NAME_INDEX = 1; 
private static final int PROJECTION_DISPLAY_NAME_INDEX = 2; 
private static final int PROJECTION_OWNER_ACCOUNT_INDEX = 3; 
private static final int PROJECTION_COLOR_INDEX = 4; 


private List<CalendarAccount> getAccountCalendars() { 
    // Run query 
    Cursor cur; 
    ContentResolver cr = context.getContentResolver(); 
    Uri uri = Calendars.CONTENT_URI; 
    String selection = "(" + Calendars.VISIBLE + " = ?)"; 
    String[] selectionArgs = new String[] {"1"}; 
    // Submit the query and get a Cursor object back. 
    cur = cr.query(uri, EVENT_PROJECTION, selection, selectionArgs, null); 
    List<CalendarAccount> calendarAccounts = new ArrayList<>(); 
    // Use the cursor to step through the returned records 
    while (cur.moveToNext()) { 
     long calID = 0; 
     String displayName = null; 
     String accountName = null; 
     String ownerName = null; 
     @ColorInt int color = 0; 

     // Get the field values 
     calID = cur.getLong(PROJECTION_ID_INDEX); 
     displayName = cur.getString(PROJECTION_DISPLAY_NAME_INDEX); 
     accountName = cur.getString(PROJECTION_ACCOUNT_NAME_INDEX); 
     ownerName = cur.getString(PROJECTION_OWNER_ACCOUNT_INDEX); 
     color = cur.getInt(PROJECTION_COLOR_INDEX); 

     Calendar calendar = new Calendar(calID, displayName, color); 
     CalendarAccount calendarAccount = new CalendarAccount(accountName); 
     int index = calendarAccounts.indexOf(calendarAccount); 
     if (index != -1) { 
      calendarAccount = calendarAccounts.get(index); 
     } else { 
      calendarAccounts.add(calendarAccount); 
     } 
     calendarAccount.getCalendars().add(calendar); 
    } 
    return calendarAccounts; 
}