这一部分主要介绍如何使用已获得的Access Token去获取Gmail以及计算未读邮件的数量。
1. 从上一篇博客里获得的AccessToken以及Secret,生成OAuthConsumer,非常简单。
CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer("anonymous", "anonymous"); consumer.setTokenWithSecret(token, secret);
2. Gmail提供了RSS Feed,只需要使用token取得RSS Feed,就拿到了Gmail的内容。其中:
https://mail.google.com/mail/feed/atom/ 对应Inbox里的未读邮件
https://mail.google.com/mail/feed/atom/unread/ 对应所有的未读邮件
https://mail.google.com/mail/feed/atom/labelname/ 对应某个label的未读邮件
我只需要取得用户的Inbox的未读邮件,因此code是这样的:
HttpGet request = new HttpGet("https://mail.google.com/mail/feed/atom/"); // sign the request try { consumer.sign(request); } catch (Exception e) { e.printStackTrace(); } // send the request HttpClient httpClient = new DefaultHttpClient(); org.apache.http.HttpResponse response; try { response = httpClient.execute(request); feedString = read(response.getEntity().getContent()); } catch (Exception e) { e.printStackTrace(); }
feedString里就保存了Google返回的feed的内容。而函数read是为了把response里的内容读出来生成String. 这个是从网上抄来的…
private static String read(InputStream in) throws IOException { StringBuilder sb = new StringBuilder(); BufferedReader r = new BufferedReader(new InputStreamReader(in), 1000); for (String line = r.readLine(); line != null; line = r.readLine()) { sb.append(line); } in.close(); return sb.toString(); }
3. 有了feed,就剩下计算unread count的工作了。这分成两部分。
i) 从String生成XML Document,其实是一个DOM tree;
ii) 在XML Document里parse数据,取得unread count.
关于i) 也是网上有相应的code:
private static Document XMLfromString(String xml){ Document doc = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); doc = db.parse(is); } catch (ParserConfigurationException e) { // XML parse error return null; } catch (SAXException e) { // Wrong XML file structure return null; } catch (IOException e) { //I/O exeption return null; } return doc; }
关于ii) Gmail的一个个邮件是放在一个个entry里的,所以只需要parse entry就行了。
NodeList nodes = feedDoc.getElementsByTagName("entry"); unread_count = nodes.getLength();
这就搞定了未读邮件数量的计算。
4. 虽然正常情况下都没问题,但是假如用户改了密码,token就无效了,应该检测这种情况,然后让用户重新进行authenticate。虽然这不常见,但也得处理。
假如Token变得无效,Gmail会返回一个显示Unauthorized的网页。因此最简单的方法是通过字符串判断. 注意如果是正常的feed,string是以<?xml为开头的,而如果是unauthorized的网页,就以<HTML>开头。
private static boolean verifyValid(String doc) { return !(doc.startsWith("<HTML>") && doc.contains("<TITLE>Unauthorized")); }
这样就解决了。
Q.E.D.