2010-06-07 115 views
8

Please note there is a new way of doing this

我一直试图让没有运气未读的Gmail邮件数量。如何获得未读的Gmail邮件数量(在Android)

我读过Gmail.javagmail4j从这个问题中取出该网站的链接都:Android - How can I find out how many unread email the user has?

但还是之后看了这一切,一对夫妇的其他网站的是谈到了这个特定主题我的问题依然存在:

问::如何获取Gmail未读数?

对不起,如果它接缝有点坚持,但我明显缺乏知识从我自己的来源找到这个。

PS:我想澄清一下,我想要做到这一点,而不必向用户索要凭据。

只是2添加一些颜色的问题让我告诉你我的应用程序的外观。

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

Please note there is a new way of doing this

回答

22

这是一些代码片段。不确定它是否有效,无法测试。但我希望它能帮助你继续调查。

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

需要许可

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

这对我来说就像是没问题,但是通过该代码,我得到了这个调试消息: 06-14 17:37:03.451:DEBUG/Gmail(13764):MailProvider.query:content:// gmail-ls/labels/------ @ gmail.com(null,null) 请注意,我的电子邮件地址不是[email protected],但我已将其替换。 还需要正确查询权限“com.google.android.providers.gmail.permission.READ_GMAIL” 。 – 2010-06-14 20:40:43

+0

在2.2上适合我。返回未读消息的正确数量。我需要的权限是com.google.android.gm.permission.READ_GMAIL。所有代码都来自Gmail.java,因此您可以在此处找到更多详细信息。 – Fedor 2010-06-15 12:00:49

+0

非常感谢,我会在不同的AVD上尝试它... – 2010-06-15 19:05:34

5

这是多么我已经看到它在为awesome窗口管理器简单的小工具(是的,这就是它的名字:))来完成。原始脚本在这里:gmail.lua

基本概念是只使用inbox feed并获取特殊“未读”标签的所有邮件(您将只获得摘要,而不是全部内容)。 URL是https://mail.google.com/mail/feed/atom/unread,你只需要获取它(在认证之后,当然),然后解析它。您可以使用某种类型的XML解析器或仅使用简单的正则表达式(<fullcount>([%d]+)</fullcount>) - 您正在查找的数字始于<fullcount>标记中。

所以,这是一种方法,很简单,“笨”,但嘿,它的工作原理:D它可能不是最好的解决方案,因为它需要你取得整个饲料(取决于数量未读邮件和连接类型/质量,它可能不是一样快,只是获取未读邮件的数量),但像往常一样,现实生活中的测试应该清除了:)

+0

感谢您花时间回答问题,但问题是: 我想在Android上执行此操作(问题的标题) 而且我需要执行此操作而无需使用用户凭据。 (问题的正文) 谢谢:) – 2010-06-13 16:14:26

+0

嗯,是的,我注意到它是针对Android的,从链接问题来看,似乎没有“银弹”类型的解决方案。所以我想你可能想要使用不同的方法,不依赖于Android的软件,但更通用。正如你指出的那样,它有缺点,它需要询问用户凭证。 – 2010-06-13 18:39:37

0

也许你可以使用Gmail ContentProvider,请参阅http://www.google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/provider/Gmail.java&q=Gmail.java&sa=N&cd=1&ct=rc

有一种方法getNumUnreadConversations,或者您可以使用Observer。

+0

你能再详细一点吗?正如我在这个问题上所说的:“我明显缺乏知识来自己找到这个” 我试图从Gmail.java中采取该方法,但我不能。 我是否必须复制整个代码才能正常工作? – 2010-06-13 16:09:10

2

有新的方式如何做到这一点。旧的方式不再工作(21.01.2013)。 检查以下链接: Gmail Public Labels API

+0

感谢您的更新,我不会更改所选的答案,因为答案当时是正确的。 但我非常感谢您的帮助。 – 2013-01-22 00:56:03

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

希望上面的代码帮助。这应该适用于Android 2.2+。

相关问题