使用googleapi-client-java操作gtasks(二)
对于很多第三方的机器没有安装Google账户管理,要访问GTasks,那么可以使用OAuth 2.0的认证方式。
OAuth 2.0的认证流程:
1.得到授权码
2.使用授权码获得真正的数据访问令牌
其中数据访问令牌一般有效期为60分钟,在得到此访问令牌的时候还会得到一个刷新令牌,当访问令牌过期后可以用此刷新令牌自动获得一个新的。
1.授权码的获得:
用浏览器打开一个url,这个url是由要访问的服务以及其他一些相关信息生成的。
/* * https://code.google.com/oauthplayground 可以找到一个scope列表。 */private final static String SCOPE = "https://www.googleapis.com/auth/tasks";/*以下信息来自于https://code.google.com/apis/console *创建一个Project,然后选择要激活的Service,我激活了Calendar和Tasks API *选择API Access,可以设置OAuth 2.0,进而得到相关信息。 *创建id时选择for installed applications。 */private final static String CLIENT_ID = "你的id.apps.googleusercontent.com";private final static String CLIENT_SECRET = "你的secret";private static final String CALLBACK_URL = "urn:ietf:wg:oauth:2.0:oob"; private void requestAuthCode() {String authorizeUrl = new GoogleAuthorizationRequestUrl(CLIENT_ID, CALLBACK_URL, SCOPE).build(); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(authorizeUrl)); startActivity(intent);}
private boolean requestToken(String authCode) { GoogleAuthorizationCodeGrant authRequest = new GoogleAuthorizationCodeGrant(mTransport, new JacksonFactory(), CLIENT_ID, CLIENT_SECRET, authCode, CALLBACK_URL); authRequest.useBasicAuthorization = false; AccessTokenResponse authResponse;try {authResponse = authRequest.execute();//发出请求mAccessToken = authResponse.accessToken;mRefreshToken = authResponse.refreshToken;return true;} catch( HttpResponseException he) {he.printStackTrace();return false;} catch (IOException e) {e.printStackTrace();return false;} }
if(mAccessProtectedResource == null) {mAccessProtectedResource = new GoogleAccessProtectedResource(mAccessToken,mTransport, new JacksonFactory(), CLIENT_ID, CLIENT_SECRET, mRefreshToken);}if(mService == null) mService = new Tasks(mTransport, mAccessProtectedResource, new JacksonFactory());mTaskListNames.clear(); try {List<TaskList> lists = mService.tasklists.list().execute().items;for(TaskList tl : lists) {mTaskListNames.add(tl.title);}mAdapter.notifyDataSetChanged();} catch(HttpResponseException he) {if(he.getResponse().getStatusCode() == 401) {//token 过期,刷新tokentry {mAccessProtectedResource.refreshToken();mAccessToken = mAccessProtectedResource.getAccessToken();mRefreshToken = mAccessProtectedResource.getRefreshToken();} catch (IOException e) {e.printStackTrace();}}} catch (IOException e) {}