Cómo obtener la cantidad de correos de Gmail sin leer (en Android)

Tenga en cuenta que hay una nueva forma de hacerlo

He intentado obtener la cantidad de mensajes de Gmail sin leer sin suerte.

He leído Gmail.java y gmail4j ambos enlaces sacados de este sitio a partir de esta pregunta: Android: ¿cómo puedo saber cuántos correos electrónicos no leídos tiene el usuario?

Pero aún después de haber leído todo eso y un par de otros sitios que hablaron sobre este tema en particular, mi pregunta sigue siendo:

P : ¿Cómo puedo obtener el contador sin leer de Gmail?

Lo siento si suena un poco insistente, pero claramente me falta el conocimiento para descubrir esto por mi cuenta de la fuente.

PD: Me gustaría aclarar que quiero hacerlo sin tener que pedirle credenciales al usuario.

Solo 2 agrega algunos colores a la pregunta, déjame mostrarte el aspecto de mi aplicación.

texto alternativo http://img716.imageshack.us/img716/8818/lookr.png

Tenga en cuenta que hay una nueva forma de hacerlo

Aquí hay un fragmento de código. No estoy seguro de que funcione y no puedo probarlo. Pero espero que te ayude a continuar la investigación.

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@company.com"; 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()); } } 

Requiere permiso

  

Así es como lo he visto en un widget simple para el impresionante administrador de ventanas (sí, ese es su nombre :)). La secuencia de comandos original está aquí: gmail.lua .

El concepto básico es simplemente usar el feed de la bandeja de entrada y obtener todos los correos (obtendrá solo los resúmenes, no todo el contenido) para la etiqueta especial “no leída”. La URL es https://mail.google.com/mail/feed/atom/unread , solo tiene que buscarla (después de la autenticación, por supuesto) y luego analizarla. Puede utilizar algún tipo de analizador XML o simplemente una simple ([%d]+) ( ([%d]+) ): el número que está buscando está al principio, en la etiqueta .

Entonces, esa es una forma de hacerlo, bastante simple y “tonto”, pero bueno, funciona: D Puede que no sea la mejor solución, ya que requiere que obtengas todo el feed (dependiendo de la cantidad de mensajes no leídos y el tipo / calidad de la conexión, puede que no sea tan rápido como solo obtener el número de mensajes no leídos), pero como de costumbre, las pruebas de la vida real deberían aclarar eso 🙂

Hay una nueva forma de hacerlo. La forma antigua ya no funciona (21.01.2013). Verifique el siguiente enlace: API de tags públicas de Gmail

Tal vez pueda usar Gmail ContentProvider, consulte http://www.google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/provider/Gmail.java&q=Gmail.java&sa=N&cd=1&ct= rc

Hay un método getNumUnreadConversations o puede usar un Observer.

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

La esperanza sobre el código ayuda. Esto debería funcionar en Android 2.2+.