2010-06-07 9 views
8

Please note there is a new way of doing this

J'ai essayé d'obtenir le nombre de messages non lus gmail avec pas de chance.Comment obtenir le nombre de messages non lus gmail (sur Android)

J'ai lu Gmail.java et gmail4j les liens retirés de ce site de cette question: Android - How can I find out how many unread email the user has?

Mais encore après avoir lu tout cela et quelques autres sites qui a parlé de ce sujet particulier mes question demeure :

Q: Comment puis-je obtenir le nombre non lu de Gmail?

Désolé, si elle semble un peu insistante, mais Je manque clairement la connaissance pour trouver cela par moi-même de la source. PS: Je voudrais préciser que je veux le faire sans avoir à demander des informations d'identification à l'utilisateur.

Juste 2 ajouter quelques couleurs à la question laissez-moi vous montrer les regards de mon application.

alt text http://img716.imageshack.us/img716/8818/lookr.png

Please note there is a new way of doing this

Répondre

22

Voici un extrait de code. Pas sûr que cela fonctionne et ne peut pas le tester. Mais j'espère que cela vous aidera à poursuivre l'enquête.

public static final class LabelColumns { 
    public static final String CANONICAL_NAME = "canonicalName"; 
    public static final String NAME = "name"; 
    public static final String NUM_CONVERSATIONS = "numConversations"; 
    public static final String NUM_UNREAD_CONVERSATIONS = "numUnreadConversations"; 
} 

public void queryLabels(){ 
    String account="[email protected]"; 
    Uri LABELS_URI = Uri.parse("content://gmail-ls/labels/"); 
    Uri ACCOUNT_URI = Uri.withAppendedPath(LABELS_URI, account); 
    ContentResolver contentResolver=myActivity.getContentResolver(); 
    Cursor cursor = contentResolver.query(ACCOUNT_URI, null, null, null, null); 

    //iterate over all labels in the account 
    if (cursor.moveToFirst()) { 
     int unreadColumn = cursor.getColumnIndex(LabelColumns.NUM_UNREAD_CONVERSATIONS); 
     int nameColumn = cursor.getColumnIndex(LabelColumns.NAME); 
     do { 
      String name = cursor.getString(nameColumn); 
      String unread = cursor.getString(unreadColumn);//here's the value you need 
     } while (cursor.moveToNext()); 
    } 
} 

requiert l'autorisation

<uses-permission android:name="com.google.android.gm.permission.READ_GMAIL"/> 
+0

Cela me semble comme c'est ok, mais avec ce code, je reçois ce message de débogage: 06-14 17: 37: 03.451: DEBUG/Gmail (13764): MailProvider.query: contenu: // gmail-ls/labels/------ @ gmail.com (null, null) s'il vous plaît noter que mon adresse e-mail n'est pas [email protected] mais je l'ai remplacé. Vous devez également interroger correctement l'autorisation "com.google.android.providers.gmail.permission.READ_GMAIL" . –

+0

Fonctionne bien pour moi sur 2.2. Renvoie le nombre correct de messages non lus. L'autorisation requise est com.google.android.gm.permission.READ_GMAIL pour moi. Tout le code a été pris de Gmail.java ainsi vous pouvez trouver plus de détails là. – Fedor

+0

Merci beaucoup, je vais l'essayer sur différents AVD puis ... –

5

Voilà comment je l'ai vu faire dans un simple widget pour le gestionnaire de fenêtres awesome (oui, c'est son nom :)). Le script original est ici: gmail.lua.

Le concept de base est d'utiliser simplement le inbox feed et d'obtenir tous les mails (vous obtiendrez seulement les résumés, pas tout le contenu) pour le tag spécial 'non lu'. L'URL est https://mail.google.com/mail/feed/atom/unread, il vous suffit de la récupérer (après l'authentification, bien sûr), puis l'analyser. Vous pouvez utiliser une sorte d'analyseur XML ou simplement une simple expression rationnelle (<fullcount>([%d]+)</fullcount>) - le numéro que vous recherchez est au début, dans la balise <fullcount>. Donc, c'est une façon de le faire, assez simple et "bête", mais bon, ça marche: D Ce n'est peut-être pas la meilleure solution, car il faut que vous récupériez le flux entier (en fonction du nombre de vos messages non lus et le type/qualité de la connexion, il pourrait ne pas être aussi rapide que juste aller chercher le nombre de messages non lus), mais comme d'habitude, les tests de la vie réelle devrait éclaircir ce :)

+0

Merci d'avoir pris le temps de répondre à la question, mais la chose est: Je veux faire sur Android (Titre de la question) Et je dois faire cela sans avoir à utiliser les informations d'identification utilisateur. (Corps de la question) Merci :) –

+0

Eh bien, oui, j'ai remarqué que c'est pour l'Android, et de la question que vous avez liée, il est apparu qu'il n'y a pas de "solution miracle" -type de solution. J'ai donc pensé que vous pourriez vouloir utiliser une approche différente, celle qui ne repose pas sur le logiciel d'Android, mais qui est plus générique. Comme vous l'avez indiqué cependant, il a l'inconvénient de demander des informations d'identification. –

0

peut-être que vous pouvez utilisez le Gmail ContentProvider, veuillez voir http://www.google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/provider/Gmail.java&q=Gmail.java&sa=N&cd=1&ct=rc

Il existe une méthode getNumUnreadConversations ou vous pouvez utiliser un observateur.

+0

Pourriez-vous élaborer un peu plus? comme je l'ai dit sur la question: "Je manque clairement la connaissance pour trouver ceci par moi-même" J'ai essayé de prendre cette méthode sur le Gmail.java mais je ne peux pas. Dois-je copier tout le code pour que cela fonctionne? –

2

Il y a une nouvelle façon comment le faire. L'ancienne façon ne fonctionne plus (21.01.2013). Vérifiez le lien suivant: Gmail Public Labels API

+0

Merci pour la mise à jour, je ne vais pas changer la réponse sélectionnée parce que la réponse était correcte à ce moment-là. Mais je vous remercie pour votre aide. –

0
static final String AUTHORITY = "com.google.android.gm"; 
static final String BASE_URI_STRING = "content://" + AUTHORITY; 
static final String LABELS_PARAM = "/labels"; 
static final String ACCOUNT_TYPE_GOOGLE = "com.google"; 

public static final String NUM_UNREAD_CONVERSATIONS = "numUnreadConversations"; 
public static final String CANONICAL_NAME = "canonicalName"; 

public static final String CANONICAL_NAME_INBOX_CATEGORY_PRIMARY = "^sq_ig_i_personal"; 
static String[] GMAIL_PROJECTION = { 
    CANONICAL_NAME, NUM_UNREAD_CONVERSATIONS 
    }; 

public static Uri getLabelsUri(String account) { 
    return Uri.parse(BASE_URI_STRING + "/" + account + LABELS_PARAM); 
} 

static String[] getAllAccountNames(Context context) { 
    final Account[] accounts = AccountManager.get(context).getAccountsByType(
      ACCOUNT_TYPE_GOOGLE); 
    final String[] accountNames = new String[accounts.length]; 
    for (int i = 0; i < accounts.length; i++) { 
     accountNames[i] = accounts[i].name; 
    } 
    return accountNames; 
} 


protected static int getGmail(Context context) { 
    ContentResolver cr = context.getContentResolver(); 
    Cursor cursor =  cr.query(Launcher.getLabelsUri(BadgeUtils.getAllAccountNames(context)[0]), 
      GMAIL_PROJECTION, 
      null, null, 
      null); 

    if (cursor == null || cursor.isAfterLast()) { 
     Log.d(TAG, "No Gmail inbox information found for account."); 
     if (cursor != null) { 
      cursor.close(); 
     } 
     return 0; 
    } 

    int count = 0; 

    while (cursor.moveToNext()) { 
     if (CANONICAL_NAME_INBOX_CATEGORY_PRIMARY.equals(cursor.getString(cursor.getColumnIndex(CANONICAL_NAME)))) { 
      count = cursor.getInt(cursor.getColumnIndex(NUM_UNREAD_CONVERSATIONS));; 
      break; 
     } 
    } 

    cursor.close(); 


    return count; 
} 

espoir code ci-dessus aide. Cela devrait fonctionner sur Android 2.2+.