8
votes

Comment obtenir le nombre de mails Gmail non lus (sur Android)

Veuillez noter ici est une nouvelle façon de faire cela

J'ai essayé d'obtenir le nombre de mails Gmail non lus sans chance.

J'ai lu gmail.java et gmail4j Les deux liens sortis de ce site à partir de cette question: Android - Comment puis-je savoir combien il a été envoyé par courrier électronique à l'utilisateur?

Mais toujours après avoir lu tout cela et quelques autres sites qui ont parlé de ce sujet particulier, ma question reste:

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

Désolé si cela couture un peu insistant, mais Je manque clairement de la connaissance pour la découvrir à moi-même de la source.

PS: Je voudrais clarifier que je veux le faire sans avoir à demander à l'utilisateur des informations d'identification.

juste 2 Ajouter des couleurs à la question Laissez-moi vous montrer l'apparence de mon application.

 text alt

Veuillez noter ici est une nouvelle façon de faire cela


0 commentaires

5 Réponses :


5
votes

Voici comment j'ai vu cela fait dans un simple widget pour le Gestionnaire de fenêtres génial (oui, C'est son nom :)). Le script d'origine est ici: gmail.lua .

Le concept de base consiste à simplement utiliser le flux de boîte de réception et obtenir Tous les mails (vous obtiendrez simplement les résumés, pas le contenu entier) pour la balise «non lu» spéciale. L'URL est https://mail.google.com/mail/feed/atom/unread , il suffit de la récupérer (après l'authentification, bien sûr), puis de l'analyser. Vous pouvez utiliser une sorte d'analyseur XML ou juste un simple regexp ( ([% d] +) ) - Le numéro que vous recherchez est au début, dans Le tag.

Donc, c'est une façon de le faire, assez simple et "muet", mais bon, cela fonctionne: d Ce n'est peut-être pas la meilleure solution, car il vous oblige à récupérer l'ensemble de l'alimentation (en fonction du nombre de votre Messages non lus et le type / la qualité de la connexion, il peut ne pas être aussi rapide que juste chercher le nombre de messages non lus), mais comme d'habitude, des tests réels devraient effacer cela :)


2 commentaires

Merci d'avoir pris le temps de répondre à la question mais la chose est la suivante: je veux faire cela sur Android (titre de la question) et je dois le faire sans avoir à utiliser les informations d'identification de l'utilisateur. (Corps de la question) Merci :)


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 ait aucune "balle d'argent" -Type de solution. Je pensais donc que vous voudrez peut-être utiliser une approche différente, une approche qui ne s'appuie pas sur le logiciel d'Android, mais est plus générique. Comme vous l'avez souligné cependant, cela a la possibilité de demander des informations d'identification de l'utilisateur.



0
votes

Peut-être que vous pouvez utiliser le gmail Contentprovider, s'il vous plaît voir http://www.google.com/codeSearch/p?hl=fr#ux1gffpyozk/core/java/andrroid/provider/gmail.java&q=gmail .java & SA = N & CD = 1 & CT = RC

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


1 commentaires

Pourriez-vous élaborer un peu plus? Comme je l'ai dit sur la question: «Je manque clairement des connaissances pour trouver cela seul» J'ai essayé de prendre cette méthode hors de la gmail.java mais je ne peux pas. Dois-je copier le code entier pour que cela fonctionne?



21
votes

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

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


6 commentaires

Cela me ressemble comme ça va, 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) Veuillez noter que mon adresse e-mail n'est pas ------@gmail.com mais je l'ai remplacé. Aussi à interroger correctement l'autorisation "com.google.android.providers.gmail.permission.read_gmail" est nécessaire.


Fonctionne grand pour moi sur 2.2. Renvoie les numéros corrects de messages non lus. La permission requise est com.google.android.gm.permission.read_gmail pour moi. Tout code a été pris de Gmail.java afin que vous puissiez trouver plus de détails là-bas.


J'ai trouvé un problème avec ça ... Je ne pouvais pas trouver un moyen de tester ce code sur le 2.2 car je n'ai pas de mobile de la version d'Android. Et l'AVD vient sans service gmail ...


Cette réponse est venue pour moi dans une recherche, mais regardez ce lien: Stackoverflow.com/questions/6871200/... . Cela ne fonctionne plus de manière fiable


Cela ne fonctionne que dans Android 2.2 ou plus tôt, pas dans les versions plus récentes.


Bonjour, j'ai besoin de l'exemple ci-dessus.So si cela ne vous dérange pas s'il vous plaît donner du code compliqué.




0
votes
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;
}
Hope above code helps. This should work on Android 2.2+.

0 commentaires