- 浏览: 549628 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
q649916440:
使用这个的目的是什么呢?感觉没啥优势啊,用起来还绕个大圈
使用googleapi-client-java操作gtasks(一) -
文艺吧网:
还有一个GZIP的问题,我怎么转都乱码最后是因为要解压一下ht ...
关于使用InputStreamReader读取GBK编码文件乱码的问题 -
xiaodousa:
9楼正解!
Android在Listview中使用EditText -
fxiaozj:
zyp09 写道很想知道在Mainactivity界面怎么获得 ...
Android PreferenceActivity 学习笔记 -
zylc369:
楼主很用心,一定要顶
Android通过共享用户ID来实现多Activity进程共享
Google Tasks的API终于开放了,可以方便的保存树状工作任务,对照文档和例子摸索了一遍,将一些关键点给大家分享一下。
如果对于googleapi-client-java库没什么了解,可以参考我前面的一篇文章:
http://mypyg.iteye.com/admin/blogs/816237
当然这个库自从那个时候后又更新了很多,好用多了。
下载库:
http://code.google.com/p/google-api-java-client/wiki/APIs
这里面的包每个都包含了google api client,并且根据服务的不同,进行了各自的扩展,我们这儿选择Tasks的API,下载库,另外还有文档,还有个更有意思的:https://code.google.com/apis/explorer/#_s=tasks&_v=v1,API浏览页面,可以直接输入法参数然后与服务器通信很直观的看到与服务器交换的数据内容,因为要访问个人数据,使用explorer时注意右上角 Switch to Private Access,切换到授权模式。
阅读示例代码http://code.google.com/p/google-api-java-client/source/browse/taskqueue-json-oauth-sample?repo=samples
打开eclipse,首选创建一个空project,将刚才下载的zip包导入此项目,以方便其他项目引用其中的jar包。
然后创建一个新项目,设置build path,要手工加上以下几个包的依赖:
google-api-client-1.7.0
google-api-client-android2-1.7.0
google-api-tasks-v1-rev2-java-1.4.0
google-http-client-1.7.0
google-http-client-android2-1.7.0
google-oauth-client
guava-11.0.1
jackson-coer-asl
如果不加的话,最终生成apk包时不会包含,会导致运行时出现类找不到的情况。
其中android2的两个包时针对android sdk 2以上平台的,都是在相应的通用包上作了一点扩展,但是并没有包含通用包,所以对应的通用包也要加入build path。如果sdk是3的,那么就替换成android3的包。
使用google服务的流程:
1.使用用户名、密码获取授权Token(令牌,没有的话google不让访问数据,使用用户名和密码从google服务器获得)。
2.使用授权字符串以及其他的参数发送http请求。
3.解析响应,并处理结果。
在Android平台上获取授权可以通过AccountManager服务来实现,只要有绑定的Gmail账户,就无须再次输入密码。发送请求以及解析响应则通过googleapi-client-java库中封装的函数来实现了。
下面就结合实际的代码做下说明:
基础类:
com.google.api.services.tasks.v1.Tasks.Tasks:Tasks服务的封装类。
构造函数:
参数transport:通过http交互数据的封装类。
参数requestInitializer:对http request进行初始化的对象
参数jsonFactory:解析、构造json数据的对象
代码片段(代码具体位置参见附件,文章的代码只是为了方便讲解,位置都是乱的):
1.基本对象
2.获得Token并保存
3.从服务器获取数据:
4.关于API KEY:
如果直接使用Google的例子编译后运行,会发现服务器回应400 Bad request,跟踪发现是因为API KEY没有设置的原因(访问Google Calendar就没这个限制),Google为了防止资源被滥用,通过API KEY来限制Ap,比如Gtasks就限制每个API KEY每天只能访问5000次(一个请求就是1次),而且API KEY是跟着Ap走的,比如一个Ap有5000个人安装了,那么平均每个人每天只能访问1次Google Tasks服务了,即使这5000个人有5000个Google账户也是被这么限制。那么如何不受此限制呢?
我想的方法之一是Ap启动时,要求用户输入自己的API KEY,那么这样所有的用户就互不干扰了,各自都有5000次的可用次数了。
API Key的获得:
直接访问网址:https://code.google.com/apis/console#access
如果从来没有来过此网址,那么第一页会让你create project,点击后进入下一个页面,选择Services,把Tasks API的开关选择为ON,再选择API Access,在Simple API Access的框内就可以看到API KEY了,复制了即可。
API KEY在代码中的设置:
还有 google task 的api_key 每天限制5000次访问. 这个限制有办法破除么
现在正常的情况是private static final String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/tasks";我要用这个. 但是执行
Tasklists mTasklists = mService.tasklists();
TaskLists mTaskLists = mTasklists.list().execute();这句的execute()时报的错. 不明白为什么 GoogleJsonResponseException: 401 Unauthorized
如果对于googleapi-client-java库没什么了解,可以参考我前面的一篇文章:
http://mypyg.iteye.com/admin/blogs/816237
当然这个库自从那个时候后又更新了很多,好用多了。
下载库:
http://code.google.com/p/google-api-java-client/wiki/APIs
这里面的包每个都包含了google api client,并且根据服务的不同,进行了各自的扩展,我们这儿选择Tasks的API,下载库,另外还有文档,还有个更有意思的:https://code.google.com/apis/explorer/#_s=tasks&_v=v1,API浏览页面,可以直接输入法参数然后与服务器通信很直观的看到与服务器交换的数据内容,因为要访问个人数据,使用explorer时注意右上角 Switch to Private Access,切换到授权模式。
阅读示例代码http://code.google.com/p/google-api-java-client/source/browse/taskqueue-json-oauth-sample?repo=samples
打开eclipse,首选创建一个空project,将刚才下载的zip包导入此项目,以方便其他项目引用其中的jar包。
然后创建一个新项目,设置build path,要手工加上以下几个包的依赖:
google-api-client-1.7.0
google-api-client-android2-1.7.0
google-api-tasks-v1-rev2-java-1.4.0
google-http-client-1.7.0
google-http-client-android2-1.7.0
google-oauth-client
guava-11.0.1
jackson-coer-asl
如果不加的话,最终生成apk包时不会包含,会导致运行时出现类找不到的情况。
其中android2的两个包时针对android sdk 2以上平台的,都是在相应的通用包上作了一点扩展,但是并没有包含通用包,所以对应的通用包也要加入build path。如果sdk是3的,那么就替换成android3的包。
使用google服务的流程:
1.使用用户名、密码获取授权Token(令牌,没有的话google不让访问数据,使用用户名和密码从google服务器获得)。
2.使用授权字符串以及其他的参数发送http请求。
3.解析响应,并处理结果。
在Android平台上获取授权可以通过AccountManager服务来实现,只要有绑定的Gmail账户,就无须再次输入密码。发送请求以及解析响应则通过googleapi-client-java库中封装的函数来实现了。
下面就结合实际的代码做下说明:
基础类:
com.google.api.services.tasks.v1.Tasks.Tasks:Tasks服务的封装类。
构造函数:
Tasks(HttpTransport transport, HttpRequestInitializer requestInitializer, JsonFactory jsonFactory)
参数transport:通过http交互数据的封装类。
参数requestInitializer:对http request进行初始化的对象
参数jsonFactory:解析、构造json数据的对象
代码片段(代码具体位置参见附件,文章的代码只是为了方便讲解,位置都是乱的):
1.基本对象
/** *保存Token的类,实现了接口HttpRequestInitializer,会在HTTP请求头中增加一行 *Authorization: Oath {你得到的token} **/ private GoogleAccessProtectedResource mAccessProtectedResource = new GoogleAccessProtectedResource(null); //通过Http协议传输数据的类 private final HttpTransport mTransport = AndroidHttp.newCompatibleTransport(); //Google Tasks服务对象 private Tasks mService = new Tasks(mTransport, mAccessProtectedResource, new JacksonFactory()); //账户管理对象 private GoogleAccountManager mAccountManager = new GoogleAccountManager(this);
2.获得Token并保存
//token类型:tasks的约定即为此字符串。不要漏了前面的oauth2:否则一直提示密码错误 //或者使用tasks的auth token类型别名"Manage your tasks"。参见:http://code.google.com/apis/tasks/oauth-android-auth-token-type-aliases.html //这样用户看到的就不是一个url,而是一个可以理解的字符串。 //所有的别名列表网上找不到了,好多人在问 private static final String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/tasks"; //获取Token mAccountManager.manager.getAuthToken(account, AUTH_TOKEN_TYPE, true, new AccountManagerCallback<Bundle>() { @Override public void run(AccountManagerFuture<Bundle> future) { try { Bundle bundle = future.getResult(); if(bundle.containsKey(AccountManager.KEY_INTENT)) { Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT); intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK); //弹出窗口用户选择是否允许访问Google Tasks数据 startActivityForResult(intent, REQUEST_AUTHENTICATE); }else if(bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) { //得到授权字符串并保存 mAccessProtectedResource.setAccessToken(bundle.getString(AccountManager.KEY_AUTHTOKEN)); //从服务器获取数据 onAuthToken(); } }catch(Exception e) { handleException(e); } } }, null);
3.从服务器获取数据:
private void onAuthToken() { List<String> tasks = new ArrayList<String>(); try { /*向服务器发送请求,并解析成列表。 在这个过程中实际上向服务器发送了: GET https://www.googleapis.com/tasks/v1/users/@me/lists Authorization: OAuth {Token xxx x xx x x x} X-JavaScript-User-Agent: Google APIs Explorer google-api-gwt-client/0.1-alpha 服务器回应了: 200 OK 以及一个包含有所有列表的Json对象。 */ List<TaskList> lists = mService.tasklists.list().execute().items; for(TaskList tl : lists) { tasks.add(tl.title); } setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tasks)); } catch (IOException e) { handleException(e); } }
4.关于API KEY:
如果直接使用Google的例子编译后运行,会发现服务器回应400 Bad request,跟踪发现是因为API KEY没有设置的原因(访问Google Calendar就没这个限制),Google为了防止资源被滥用,通过API KEY来限制Ap,比如Gtasks就限制每个API KEY每天只能访问5000次(一个请求就是1次),而且API KEY是跟着Ap走的,比如一个Ap有5000个人安装了,那么平均每个人每天只能访问1次Google Tasks服务了,即使这5000个人有5000个Google账户也是被这么限制。那么如何不受此限制呢?
我想的方法之一是Ap启动时,要求用户输入自己的API KEY,那么这样所有的用户就互不干扰了,各自都有5000次的可用次数了。
API Key的获得:
直接访问网址:https://code.google.com/apis/console#access
如果从来没有来过此网址,那么第一页会让你create project,点击后进入下一个页面,选择Services,把Tasks API的开关选择为ON,再选择API Access,在Simple API Access的框内就可以看到API KEY了,复制了即可。
API KEY在代码中的设置:
mService.accessKey = 你的API_KEY;
- GtaskDemo.zip (14 KB)
- 下载次数: 195
评论
7 楼
q649916440
2018-01-22
使用这个的目的是什么呢?感觉没啥优势啊,用起来还绕个大圈
6 楼
mypyg
2012-04-09
1.使用oAuth2验证需要clientid,会被计算限额。
2.使用Android的AccountManager,虽然获得token时不需要clientid,但是执行任何操作都必须带上apikey,否则说你没登录,带上apikey了又会被计算限额。
经过试验,暂时没有找到破除的方法。
只能写mail管google要了。
或者另一种方法,多申请几个账号,10个账号就5w次了,程序里面随机使用某个账号的key。此种方法如果使用的是AccountManager获得的token,对于用户一点感觉都没有。
2.使用Android的AccountManager,虽然获得token时不需要clientid,但是执行任何操作都必须带上apikey,否则说你没登录,带上apikey了又会被计算限额。
经过试验,暂时没有找到破除的方法。
只能写mail管google要了。
或者另一种方法,多申请几个账号,10个账号就5w次了,程序里面随机使用某个账号的key。此种方法如果使用的是AccountManager获得的token,对于用户一点感觉都没有。
5 楼
Ovbk2c
2012-04-09
mypyg 写道
参考这篇 http://mypyg.iteye.com/blog/1468952
看看是不是授权码和令牌弄混了,只有授权码,没有令牌也是无法访问数据的。
看看是不是授权码和令牌弄混了,只有授权码,没有令牌也是无法访问数据的。
还有 google task 的api_key 每天限制5000次访问. 这个限制有办法破除么
4 楼
mypyg
2012-03-29
参考这篇 http://mypyg.iteye.com/blog/1468952
看看是不是授权码和令牌弄混了,只有授权码,没有令牌也是无法访问数据的。
看看是不是授权码和令牌弄混了,只有授权码,没有令牌也是无法访问数据的。
3 楼
Ovbk2c
2012-03-28
mypyg 写道
看看你用Service发出去的数据是啥,对比一下和Demo中的有啥差异
现在正常的情况是private static final String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/tasks";我要用这个. 但是执行
Tasklists mTasklists = mService.tasklists();
TaskLists mTaskLists = mTasklists.list().execute();这句的execute()时报的错. 不明白为什么 GoogleJsonResponseException: 401 Unauthorized
2 楼
mypyg
2012-03-28
看看你用Service发出去的数据是啥,对比一下和Demo中的有啥差异
1 楼
Ovbk2c
2012-03-28
你好, 很感谢你分享的经验,
我在你的demo的基础上开发关联GTask的应用.
我把与服务器同步数据部分放到了Service下执行.
在同步时执行到Tasklists mTasklists = mService.tasklists(); TaskLists mTaskLists = mTasklists.list().execute();时发生了com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
调用execute()时触发的.
授权那部分我都是参照你的demo处理的.
原来的demo一直都好用. 我在做了一次service的更改后出现了这个问题.
我在网上查了一下信息 参照一个修改了一下private static final String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/tasks.readonly";
从web端读取下来数据可以,但是对web端做修改就不行.因为是只读的.但是如果我去掉readonly.第一次执行到execute() 就会触发这个异常 你能帮我分析下吗 或者你想了解更多的问题 我的qq406704801 不胜感激
我在你的demo的基础上开发关联GTask的应用.
我把与服务器同步数据部分放到了Service下执行.
在同步时执行到Tasklists mTasklists = mService.tasklists(); TaskLists mTaskLists = mTasklists.list().execute();时发生了com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
调用execute()时触发的.
授权那部分我都是参照你的demo处理的.
原来的demo一直都好用. 我在做了一次service的更改后出现了这个问题.
我在网上查了一下信息 参照一个修改了一下private static final String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/tasks.readonly";
从web端读取下来数据可以,但是对web端做修改就不行.因为是只读的.但是如果我去掉readonly.第一次执行到execute() 就会触发这个异常 你能帮我分析下吗 或者你想了解更多的问题 我的qq406704801 不胜感激
发表评论
-
使用googleapi-client-java操作gtasks(二)
2012-03-29 15:34 4643对于很多第三方的机器没有安装Google账户管理,要访问GTa ... -
Android Activity 生命周期再验证
2011-11-22 16:20 8035Android Activity 生命活动 ... -
Nexus one开关键坏掉后的解决方法
2011-10-14 15:17 4507Nexus one手机无法开机了,网上搜索了一下发现很多人遇到 ... -
改包名导致JNI调用失败的问题
2011-08-31 13:41 5205修改以前的代码,移动了一个文件,修改了其包名,在这个文件代码中 ... -
一个好用的Google api调试网址
2011-08-09 11:00 1854https://code.google.com/apis/ex ... -
Apk文件Hack试验
2011-07-11 17:54 2895试验1:反编译dex文 ... -
一个由onKeyUp引起的问题
2011-04-19 16:05 1973刚写一个小程序,在用户按下Back按键返回时,需要保存一些数据 ... -
Android自定义组合控件
2011-03-20 18:56 12910目标:实现textview和ImageButton组合,可以通 ... -
也谈Android下一个apk安装多个程序入口图标
2011-03-18 11:28 9237Android中有的Ap功能比较复杂,为了方便用户使用,可以提 ... -
Android AppWidget实例验证
2011-02-25 15:26 134101.创建AppWidget布局,包含两个TextView用来显 ... -
Android Activity LaunchMode 验证
2011-02-23 15:04 8368在Android中,每个Activity有4种LaunchMo ... -
文件夹权限引起的MediaPlayer播放不正常
2011-01-20 20:41 2366写了一个Ap,在程序运行时会解压一些声音文件到/data/da ... -
关于使用InputStreamReader读取GBK编码文件乱码的问题
2011-01-19 17:13 25818BufferedReader reader = new Buf ... -
Android下Listview的onItemClick以及onItemLongClick等易模糊问题验证
2010-12-23 21:10 22811最近在使用Listview又遇到了以前碰到的问题,当Listv ... -
通过Java annotation以及反射机制实现不同类型通用的数据库访问接口
2010-12-22 12:14 5558在日常开发中会遇到这 ... -
Android PreferenceActivity 学习笔记
2010-12-11 12:45 20073在Ap中有时需要设置一些配置参数,这些参数通过配置文件保存。 ... -
Android平台sqlite快速入门
2010-12-07 12:00 2385以下概念都是在Android平台的sqlite3限制下的理解: ... -
Android下使用googleapi-client-java操作google calendar(三)
2010-11-29 18:57 48044.获取日历列表并显示: 原理:向https://www. ... -
Android下使用googleapi-client-java操作google calendar(二)
2010-11-28 22:50 23863.与服务器进行数据交互: 交互是通过HTTP请求及响应来进 ... -
Android下使用googleapi-client-java操作google calendar(一)
2010-11-19 14:41 5011刷机又把数据刷没了,网络时代,数据还是和服务器同步好了。 从 ...
相关推荐
组织任务 将所有Google任务导出/导入到组织文件。...(org-gtasks-register-account :name " Perso " :directory " ~/.emacs.d/gtasks/ " :client-id " XXXX " :client-secret " XXXX " ) 获取Goog
:information: 如果您想在自己的服务器上运行此应用程序,则需要获取 Google API 密钥: : 。 创建: mkvirtualenv gtask_client 。 安装要求: $ pip install -r requirements.txt 。 创建deploy.ini 。 │ .....
移至特定文件夹,例如“文档” 将文件夹的绝对路径(使用pwd )附加到PATH 从任何地方执行gtasks从源代码运行和构建的说明: 先决条件去安装说明git clone https://github.com/BRO3886/google-tasks-cli 执行指示...
Gtasks 待办任务清单:这个软件是挺好用的,只是因为是和GOOGLE同步数据,自然的google在国内又不是很受待见自然的就会出现一些错误,不过现在已经稍微好点了。 官方介绍 GTasksTo Do List|Task List是一款日程...
在几个月前工作的几个Google Tasks:trade_mark:Chrome Extensions之后,我开始使用自己的Google任务扩展作为业余爱好项目。 目前包含大多数功能。 如果您遇到任何错误,请告诉我,谢谢您尝试我的扩展!
2. Java:Java是一种广泛使用的面向对象的编程语言,也是开发Android应用的官方语言之一。Android应用开发通常涉及到使用Java进行应用逻辑编写。 3. Android Studio:Android Studio是谷歌官方提供的集成开发环境...
用过很多日程管理类软件:Doit.im、gtasks、checkmark to do、2do等,通过试用对比,发现DGT GTD这款软件相当强大,自带中文,完全免费,栏目设置非常人性化,能适合比较复杂的工作和项目管理,还可以记事,可以用来...