Как узнать количество непрочитанных писем в gmail (на андроид) - PullRequest
8 голосов
/ 07 июня 2010

Обратите внимание, что есть новый способ сделать это

Я безуспешно пытаюсь получить количество непрочитанных писем в Gmail.

I 'прочитали Gmail.java и gmail4j обе ссылки, взятые с этого сайта из этого вопроса: Android - Как узнать, сколько непрочитанных сообщений электронной почты есть у пользователя?

Но после прочтения всего этого и нескольких других сайтов, которые обсуждали эту конкретную тему, мой вопрос остается:

Q : Как я могу получитьGmail Непрочитанный счетчик?

Извините, если он кажется немного настойчивым, но Мне явно не хватает знаний , чтобы выяснить это самостоятельно из источника.

PS: Я бы хотелхотел бы уточнить, что я хочу сделать это без необходимости запрашивать учетные данные пользователя.

Просто добавьте несколько цветов в вопрос, позвольте мне показать вам внешний вид моего приложения.

альтернативный текст http://img716.imageshack.us/img716/8818/lookr.png

Обратите внимание, что есть новыйспособ сделать это

Ответы [ 5 ]

22 голосов
/ 14 июня 2010

Вот фрагмент кода. Не уверен, что это работает и не может проверить это. Но я надеюсь, что это поможет вам продолжить расследование.

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"/>
5 голосов
/ 13 июня 2010

Вот как я это сделал в простом виджете для оконного менеджера awesome (да, это его имя :)). Оригинальный скрипт здесь: gmail.lua .

Основная концепция заключается в том, чтобы просто использовать входящий фид и получать все письма (вы получите только резюме, а не весь контент) для специального тега «непрочитанный». URL-адрес https://mail.google.com/mail/feed/atom/unread, вам просто нужно получить его (после аутентификации, конечно), а затем проанализировать. Вы можете использовать какой-то синтаксический анализатор XML или просто регулярное выражение (<fullcount>([%d]+)</fullcount>) - искомый номер находится в начале, в теге <fullcount>.

Итак, это один из способов сделать это, довольно простой и «тупой», но, эй, это работает: D Это может быть не лучшим решением, так как требует, чтобы вы получили весь канал (в зависимости от количества ваших непрочитанные сообщения и тип / качество соединения, это может быть не так быстро, как , просто выборка количества непрочитанных сообщений), но, как обычно, реальное тестирование должно прояснить это)

2 голосов
/ 22 января 2013

Есть новый способ, как это сделать. Старый способ больше не работает (21.01.2013). Проверьте следующую ссылку: API общедоступных ярлыков Gmail

0 голосов
/ 11 июня 2014
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 +.

0 голосов
/ 13 июня 2010

Может быть, вы можете использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...