2010-06-07 11 views
8

Please note there is a new way of doing this

मैं कोई भाग्य के साथ अपठित जीमेल मेल की संख्या प्राप्त करने की कोशिश कर रहा हूँ।कैसे (एंड्रॉयड पर) अपठित जीमेल मेल की संख्या प्राप्त करने

मैं Gmail.java पढ़ चुके हैं और gmail4j दोनों लिंक इस सवाल से इस साइट से बाहर ले जाया: Android - How can I find out how many unread email the user has?

लेकिन फिर भी के बाद और यह सब है कि इस विशेष विषय के बारे में मेरे सवाल बनी हुई बात की अन्य साइटों के एक जोड़े पढ़ :

क्यू: मैं जीमेल अपठित गणना कैसे प्राप्त कर सकता हूं?

क्षमा करें अगर यह थोड़ा जोर देता है लेकिन मुझे स्रोत से अपने आप को खोजने के लिए स्पष्ट रूप से ज्ञान की कमी है।

पीएस: मैं यह स्पष्ट करना चाहता हूं कि मैं इसे क्रेडेंशियल्स के लिए उपयोगकर्ता से पूछे बिना करना चाहता हूं।

बस 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/जीमेल (13764): MailProvider.query: content: // gmail-ls/लेबल/------ @ gmail.com (शून्य, शून्य) कृपया ध्यान दें कि मेरा ईमेल पता [email protected] नहीं है लेकिन मैंने इसे बदल दिया है। "com.google.android.providers.gmail.permission.READ_GMAIL" की अनुमति की सही ढंग से पूछताछ करने के लिए भी आवश्यक है। –

+0

2.2 पर मेरे लिए बहुत अच्छा काम करता है। अपठित संदेशों की सही संख्या देता है। मेरे लिए आवश्यक अनुमति com.google.android.gm.permission.READ_GMAIL है। सभी कोड जीमेल.जावा से लिया गया था ताकि आपको वहां अधिक जानकारी मिल सके। – Fedor

+0

बहुत बहुत धन्यवाद, मैं इसे विभिन्न एवीडी के बाद कोशिश करूंगा ... –

5

यह मैं इसे awesome विंडो प्रबंधक के लिए एक सरल विजेट (हाँ, कि इसके नाम से पता है :)) में किया कैसे देखा है है। मूल लिपि यहां है: ।

मूल अवधारणा केवल inbox feed का उपयोग करना है और विशेष 'अपठित' टैग के लिए सभी मेल प्राप्त करें (आपको केवल सारांश मिलेगा, पूरी सामग्री नहीं)। यूआरएल https://mail.google.com/mail/feed/atom/unread है, आपको बस इसे (प्रमाणीकरण के बाद) प्राप्त करना होगा, और उसके बाद इसे पार्स करना होगा। आप या तो कुछ प्रकार के एक्सएमएल पार्सर या सिर्फ एक साधारण रीजएक्सपी (<fullcount>([%d]+)</fullcount>) का उपयोग कर सकते हैं - जिस नंबर पर आप खोज रहे हैं, वह <fullcount> टैग में शुरुआत में है।

तो, यह करने का एक तरीका है, काफी सरल और "गूंगा", लेकिन हे, यह काम करता है: डी यह सबसे अच्छा समाधान नहीं हो सकता है, क्योंकि यह आपको पूरी फ़ीड लाने की आवश्यकता है (संख्या के आधार पर आपके अपठित संदेशों और प्रकार/कनेक्शन की गुणवत्ता, यह जितनी तेजी से अपठित संदेशों की संख्या प्राप्त नहीं कर सकता है), लेकिन सामान्य रूप से, वास्तविक जीवन परीक्षण को साफ़ करना चाहिए :)

+0

समय देने के सवाल का जवाब देने के लिए धन्यवाद, लेकिन बात यह है: मैं Android पर यह करने के लिए (सवाल का शीर्षक) चाहते और मैं उपयोगकर्ता क्रेडेंशियल का उपयोग किए बिना ऐसा करने की जरूरत है। (प्रश्न का बॉडी) धन्यवाद :) –

+0

ठीक है, हाँ, मैंने देखा है कि यह एंड्रॉइड के लिए है, और आपके द्वारा लिंक किए गए प्रश्न से यह पता चला है कि समाधान की कोई "चांदी बुलेट" नहीं है। इसलिए मैंने सोचा कि आप एक अलग दृष्टिकोण का उपयोग करना चाहेंगे, जो एंड्रॉइड के सॉफ्टवेयर पर भरोसा नहीं करता है, लेकिन यह अधिक सामान्य है। जैसा कि आपने बताया है, यह नकारात्मक है कि इसे उपयोगकर्ता प्रमाण-पत्रों के लिए पूछने की आवश्यकता है। –

0

शायद आप कर सकते हैं जीमेल कंटेंटप्रोवाइडर का उपयोग करें, कृपया http://www.google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/provider/Gmail.java&q=Gmail.java&sa=N&cd=1&ct=rc

एक विधि प्राप्त है NumUnreadConversations या आप ऑब्जर्वर का उपयोग कर सकते हैं।

+0

क्या आप थोड़ा और विस्तार कर सकते हैं? जैसा कि मैंने इस सवाल पर कहा था: "मुझे अपने स्वयं के" पर यह जानने के लिए ज्ञान की स्पष्ट रूप से कमी है। मैंने Gmail.java से उस विधि को लेने की कोशिश की है लेकिन मैं नहीं कर सकता। क्या मुझे इस काम के लिए पूरे कोड की प्रतिलिपि बनाना है? –

2

आवश्यक है नया तरीका इसे कैसे करना है। पुराना तरीका अब और काम नहीं करता है (21.01.2013)।लिंक का पालन की जांच: Gmail Public Labels API

+0

अद्यतन के लिए धन्यवाद, मैं चयनित उत्तर बदलने वाला नहीं हूं क्योंकि उस समय उत्तर सही था। लेकिन आपकी मदद के लिए मैं आपको धन्यवाद देता हूं। –

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

आशा कोड ऊपर मदद करता है। यह एंड्रॉइड 2.2+ पर काम करना चाहिए।