Как получить количество непрочитанных писем 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+.