Android应用:获取Google Drive API的访问令牌

时间:2012-05-25 18:14:15

标签: google-drive-api

我正在编写Android(版本ICS)应用。将数据上传到Google云端硬盘。该应用程序 使用oauth2获取访问令牌。

第一步:获取授权令牌。

    String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/drive";
    // Step 1
    accountManager.getAuthToken(
        account,                                // Account retrieved using getAccountsByType("com.google")
        AUTH_TOKEN_TYPE,                        // Auth Token Type
        options,                                // Authenticator-specific options
        this,                                   // Your activity
        new OnTokenAcquired(),                  // Callback called when a token is successfully acquired
        new Handler(new OnAuthTokenError()));   // Callback called if an error occurs
}
private class OnTokenAcquired implements AccountManagerCallback<Bundle> {
    @Override
    public void run(AccountManagerFuture<Bundle> result) {
        // Get the result of the operation from the AccountManagerFuture.
        Bundle bundle;
        try {
            bundle = result.getResult();

            authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);

            Log.d(TAG,"authToken:" + authToken);

            exchangeToken access = (exchangeToken) new exchangeToken().execute();

        } catch (OperationCanceledException e) {
            e.printStackTrace();
        } catch (AuthenticatorException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
} 

成功。获取授权令牌。

第2步:为访问令牌交换授权令牌。

    private class exchangeToken extends AsyncTask<String, Void, Void> {

    @Override
    protected Void doInBackground(String... params) {
        HttpTransport transport = new NetHttpTransport();
        JsonFactory jsonFactory = new GsonFactory();
        String CLIENT_ID = "999999999999.apps.googleusercontent.com";
        String CLIENT_SECRET = "axXXXXXXXXXXXXXXX7";

        try { // Step 2: Exchange for an access and refresh token
            GoogleTokenResponse authResponse = new GoogleAuthorizationCodeTokenRequest(transport, jsonFactory, CLIENT_ID, CLIENT_SECRET, authToken, CALLBACK_URL).execute();
            accessToken = authResponse.getAccessToken();
            Log.d("Get Access","Token:" + accessToken);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}  

失败。 LogCat显示以下内容: com.google.api.client.auth.oauth2.TokenResponseException:400错误请求

{

 "error":"unauthorized_client"

}

我可以使用“云端硬盘”应用在我的Android平板电脑上访问“Google云端硬盘”。所以 我的电子邮件帐户有效。可能是AUTH_TOKEN_TYPE不正确,但谷歌云端硬盘 SDK不清楚它必须是什么。我错过了什么?

2 个答案:

答案 0 :(得分:1)

您无需执行交换令牌的第二步。 Android会直接向您授予访问令牌,但它不会授予您一个您必须交换令牌的身份验证码。

Android文档中的

This page很好地解释了一切。

答案 1 :(得分:0)

您知道要使用Drive API,您的用户必须在Chrome(!)网上商店安装您的应用吗? 通常,Documents List API是Android的最佳选择。