Android下使用googleapi-client-java操作google calendar(一)

刷机又把数据刷没了,网络时代,数据还是和服务器同步好了。

从 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中的授权字符串。

[待续]

你可能感兴趣的:(java,android,网络应用,网络协议,Google)