这一部分主要介绍如何使用已获得的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.