刷机又把数据刷没了,网络时代,数据还是和服务器同步好了。
从 http://code.google.com/p/google-api-java-client 下载了库和sample,因为此库还在更新中,文档不是很全,自己摸索了一遍,总结在下面。
访问google服务的流程:
1.使用用户名、密码获取授权字符串。
2.使用授权字符串以及其他的参数发送http请求。
3.解析响应,并处理结果。
在Android平台上第一步可以通过AccountManager服务来实现,只要有绑定的Gmail账户,就无须再次输入密码。
第二步以及第三步可以利用Google封装好的库来实现,有两个官方库可用,一个是gdata-client-java,一个是googleapi-client-java,后者是新出的库,具体该采用哪个库可以参见其Wiki根据自己的情况选择。
此处是新项目,无需考虑旧代码,所以选择了后者。
具体的流程:
1.创建一个处理HTTP发送接收的对象,通过GoogleTransport类(库提供)的静态函数create()来创建:
mTransport = GoogleTransport.create();
HTTP发送数据需要HTTP Header,GoogleTransport对象内已经自己生成了默认的Header,但是有些成员需要设置数据。
1.1 数据交换协议版本号
headers.gdataVersion = "2"; //Google data version
1.2 应用名,ap可以设置为自己的唯一字符串即可
headers.setApplicationName(getString(R.string.app_name));
1.3 创建Parser用来把HTTP传送的数据转换为对象。
AtomParser parser = new AtomParser(); //parse data from http data
parser.namespaceDictionary = Namespace.DICTIONARY;
mTransport.addParser(parser);
其中AtomParser类是库提供的,但是parser的DICTIONARY要用户定义,用来将缩写转换到url。一般可直接使用从example中复制的:
public class Namespace {
public static final XmlNamespaceDictionary DICTIONARY = new XmlNamespaceDictionary();
static {
Map<String, String> map = DICTIONARY.namespaceAliasToUriMap;
map.put("", "http://www.w3.org/2005/Atom");
map.put("atom", "http://www.w3.org/2005/Atom");
map.put("batch", "http://schemas.google.com/gdata/batch");
map.put("gAcl", "http://schemas.google.com/acl/2007");
map.put("gCal", "http://schemas.google.com/gCal/2005");
map.put("gd", "http://schemas.google.com/g/2005");
map.put("georss", "http://www.georss.org/georss");
map.put("gml", "http://www.opengis.net/gml");
map.put("openSearch", "http://a9.com/-/spec/opensearch/1.1/");
map.put("xml", "http://www.w3.org/XML/1998/namespace");
}
2.获取授权字符串,大部分操作都需要在HTTP请求中包含此字符串,这个字符串是和用户名相关的。
2.1获取账户对象:
在Android中可以使用AccountManager来获取用户列表,然后由用户选择一个。
final AccountManager manager = AccountManager.get(this); //获取AccountManger实例
final Account[] accounts = manager.getAccountsByType("com.google"); //获取所有的google账户对象
Account对象的name成员保存了帐户名字符串,可以将这些名称形成一个列表显示到对话框中供用户选择。
当用户选择后,就可使用Account对象作为参数获取授权字符串了。
2.2获取授权字符串:
Bundle bundle = manager.getAuthToken(account, "cl", true, null, null).getResult();
通过AccountManager来获取授权字符串,account是账户对象,"cl"是google约定的获取calendar服务授权时的类型。
因为此步操作要进行网络通信,可能会阻塞,所以强制要求启动一个线程来进行,如果在UI线程调用会有异常出来。
另外函数返回后,结果中未必就有授权字符串,有可能会返回需要与用户交互的Intent,比如询问用户是否允许获取授权,代码要进行处理。
if (bundle.containsKey(AccountManager.KEY_INTENT)) {
//需要和用户交互。使用此intent启动activity。
Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT);
int flags = intent.getFlags();
flags &= ~Intent.FLAG_ACTIVITY_NEW_TASK; //清除新任务标志
intent.setFlags(flags);
startActivityForResult(intent, REQUEST_AUTHENTICATE);
} else if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) {
//得到了key,执行login
authenticatedClientLogin(bundle.getString(AccountManager.KEY_AUTHTOKEN));
}
此外还要处理异常,当授权过期时,那么还要通过manager.invalidateAuthToken("com.google", this.mAuthToken);来清除cache中的授权字符串。
[待续]