【问题标题】:How to get the number of unread gmail mails (on android)如何获取未读 gmail 电子邮件的数量(在 android 上)
【发布时间】:2010-06-07 19:52:33
【问题描述】:

Please note there is a new way of doing this

我一直在尝试获取未读 gmail 邮件的数量,但没有运气。

我已经阅读了 Gmail.javagmail4j 这两个链接都来自这个问题:Android - How can I find out how many unread email the user has?

但在阅读了所有这些内容以及其他几个讨论这个特定主题的网站之后,我的问题仍然存在:

:如何获取 Gmail 未读计数?

对不起,如果它有点坚持,但我显然缺乏知识,无法从源头上自己找到这个。

PS:我想澄清一下,我想这样做,而不必向用户询问凭据。

只需为问题添加一些颜色,让我向您展示我的应用程序的外观。

Please note there is a new way of doing this

【问题讨论】:

    标签: android count gmail


    【解决方案1】:

    这里有一些代码 sn-p。不确定它是否有效并且无法测试它。但我希望它能帮助你继续调查。

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

    需要许可

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

    【讨论】:

    • 在我看来没问题,但是使用该代码我收到以下调试消息:06-14 17:37:03.451: DEBUG/Gmail(13764): MailProvider.query: content:// gmail-ls/labels/------@gmail.com(null, null) 请注意我的电子邮件地址不是 ------@gmail.com 但我已经替换了它。还需要正确查询权限“com.google.android.providers.gmail.permission.READ_GMAIL”。
    • 在 2.2 上非常适合我。返回正确数量的未读消息。对我来说,所需的权限是 com.google.android.gm.permission.READ_GMAIL。所有代码均取自 Gmail.java,因此您可以在那里找到更多详细信息。
    • 我发现了一个问题...我找不到在 2.2 上测试此代码的方法,因为我没有运行该版本 android 的移动设备。而且 avd 没有 GMAIL 服务...
    • 我在搜索中找到了这个答案,但请查看此链接:stackoverflow.com/questions/6871200/…。它不再可靠地工作了
    • 这仅适用于 Android 2.2 或更早版本,不适用于较新版本。
    【解决方案2】:

    这就是我在awesome 窗口管理器的简单小部件中看到的(是的,这就是它的名字:))。原始脚本在这里:gmail.lua

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

    所以,这是一种方法,非常简单和“愚蠢”,但是嘿,它有效 :D 这可能不是最好的解决方案,因为它需要您获取整个提要(取决于您的未读消息和连接的类型/质量,它可能没有只是获取未读消息的数量那么快),但像往常一样,现实生活中的测试应该会清除这一点:)

    【讨论】:

    • 感谢您抽出宝贵时间回答问题,但问题是:我想在 Android 上执行此操作(问题标题)而且我需要执行此操作而无需使用用户凭据。 (问题的主体)谢谢:)
    • 嗯,是的,我注意到它适用于 Android,从您链接的问题来看,似乎没有“银弹”类型的解决方案。所以我想你可能想使用一种不同的方法,一种不依赖于 Android 软件但更通用的方法。正如您所指出的,它的缺点是需要询问用户凭据。
    【解决方案3】:

    有一种新的方法可以做到这一点。旧方式不再起作用(21.01.2013)。 检查以下链接: Gmail Public Labels API

    【讨论】:

    • 感谢您的更新,我不会更改所选答案,因为当时答案是正确的。但我非常感谢您的帮助。
    【解决方案4】:

    也许您可以使用 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。

    【讨论】:

    • 您能详细说明一下吗?正如我在这个问题上所说的那样:“我显然缺乏自己找到这个的知识”我试图从 Gmail.java 中取出该方法,但我不能。我是否必须复制整个代码才能正常工作?
    【解决方案5】:
    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+。

    【讨论】:

      猜你喜欢
      • 2017-01-21
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2019-09-02
      • 1970-01-01
      • 2019-02-10
      相关资源
      最近更新 更多