Как получить количество непрочитанных писем gmail (на android)

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

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

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

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

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

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

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

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

alt-текст http://img716.imageshack.us/img716/8818/lookr.png

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

5 ответов


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

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"/>

вот как я видел это сделано в простом виджете для высокий диспетчер Окон (Да, это его имя :)). Оригинальный сценарий здесь:gmail.Луа!--5-->.

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

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


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


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


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+.