2010-06-07 6 views
8

Please note there is a new way of doing this

que he estado tratando de conseguir el número de mensajes no leídos de Gmail sin suerte.¿Cómo obtener el número de mensajes no leídos de Gmail (en Android)

He leído y Gmail.javagmail4j ambos enlaces sacados de este sitio desde esta pregunta: Android - How can I find out how many unread email the user has?

Pero aún después de haber leído todo eso y un par de otros sitios que habló sobre este tema en particular mis restos de interrogación :

Q: ¿Cómo puedo obtener el recuento de mensajes no leídos de Gmail?

Lo siento si se ve un poco insistente, pero Me falta claramente el conocimiento para averiguarlo por mi cuenta de la fuente.

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

Solo 2 agregue algunos colores a la pregunta permítame mostrarle el aspecto de mi aplicación.

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

Please note there is a new way of doing this

Respuesta

22

Aquí hay algunos fragmentos 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 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()); 
    } 
} 

requiere el permiso

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

Eso me parece que está bien, pero con ese código recibo este mensaje de depuración: 06-14 17: 37: 03.451: DEBUG/Gmail (13764): MailProvider.query: content: // gmail-ls/labels/------ @ gmail.com (nulo, nulo) tenga en cuenta que mi dirección de correo electrónico no es [email protected] pero la he reemplazado. También es necesario consultar correctamente el permiso "com.google.android.providers.gmail.permission.READ_GMAIL" . –

+0

Funciona muy bien para mí en 2.2. Devuelve los números correctos de mensajes no leídos. El permiso requerido es com.google.android.gm.permission.READ_GMAIL para mí. Todo el código fue tomado de Gmail.java para que pueda encontrar más detalles allí. – Fedor

+0

Muchas gracias, lo probaré en diferentes AVD entonces ... –

5

Esta es la forma en que he visto hacer en un widget sencillo para el administrador de awesome ventana (sí, ese es su nombre :)). La secuencia de comandos original está aquí: gmail.lua.

El concepto básico es simplemente usar el inbox feed 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 usar algún tipo de analizador XML o simplemente una expresión regular simple (<fullcount>([%d]+)</fullcount>); el número que está buscando está al principio, en la etiqueta <fullcount>.

Así que, 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 obtenga toda la alimentación (dependiendo del número de los mensajes no leídos y el tipo/calidad de la conexión, puede que no sea tan rápido como simplemente ir a buscar el número de mensajes no leídos), pero como de costumbre, las pruebas de la vida real debe aclarar eso :)

+0

Gracias por tomarse el tiempo para responder a la pregunta, pero la cosa es: que quieren hacer esto en Android (Título de la cuestión) y yo tenemos que hacer esto sin tener que utilizar las credenciales de usuario. (Cuerpo de la pregunta) Gracias :) –

+0

Bueno, sí, me di cuenta de que es para Android, y de la pregunta que vinculó parecía que no había ningún tipo de "solución milagrosa". Así que pensé que podría querer usar un enfoque diferente, uno que no dependa del software de Android, pero que sea más genérico. Sin embargo, como señaló, tiene la desventaja de que necesita solicitar credenciales de usuario. –

0

Tal vez usted puede use el Gmail ContentProvider, vea 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.

+0

¿Podría elaborar un poco más? como dije sobre la pregunta: "claramente me falta el conocimiento para encontrar esto por mi cuenta" He intentado sacar ese método de Gmail.java pero no puedo. ¿Debo copiar todo el código para que funcione? –

2

Hay una nueva forma de cómo hacerlo. La forma antigua ya no funciona (21.01.2013). Comprobar siguiente enlace: Gmail Public Labels API

+0

Gracias por la actualización, no voy a cambiar la respuesta seleccionada porque la respuesta fue correcta en ese momento. Pero le agradezco su ayuda. –

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

la esperanza por encima de código ayuda. Esto debería funcionar en Android 2.2+.

Cuestiones relacionadas