`
mypyg
  • 浏览: 545668 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

[待续]
1
0
分享到:
评论
7 楼 mypyg 2012-07-16  
新版本库中可能已经移除了。
http://mypyg.iteye.com/blog/1144965
http://mypyg.iteye.com/blog/1468952
参考这两篇吧。用的最新版本库。
6 楼 junliang237560659 2012-07-13  
不好意思,我下载了运行老是错误,不知道什么原因,说GoogleTransport找不到,能帮我一下吗,很急。
5 楼 kbest 2012-03-27  
非常感谢,有什么不懂的再请教,新版本的要导入好几个包
4 楼 mypyg 2012-03-27  
附件上传了我那个时候用的包
3 楼 kbest 2012-03-23  
希望得到demo工程zhandazhi1314@gmail.com,带jar包
按照给的jar包加了很多次
老出问题
2 楼 kbest 2012-03-23  
最近也在用这个
但是下的google-api-java-client 有很多,应该导入哪些Jar包呢?
1 楼 bluesky139 2011-06-21  
楼主的这篇文章很不错,不过是用的calendar,现在我想使用gmail发邮件,不知道楼主有没有搞过。比如"cl"是google约定的获取calendar服务授权时的类型,gmail的话又是什么呢,这个是不是在哪里可以查到,还有后面要向网站请求,网址又是怎么得来的?

相关推荐

    Android代码-农历生日

    农历生日 for Google calendar 农历生日是用来同步农历生日到 Google 日历, 因为 Google 日历不能创建农历重复事件. ...Google API Client Library for Java Lunar-Solar-Calendar-Converter License MIT

    java开源包1

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包10

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    java开源包8

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包11

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包6

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包4

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包9

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包101

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包5

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包3

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包2

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包7

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    Java资源包01

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

Global site tag (gtag.js) - Google Analytics