使用Android 4.x和scribe的OAuth 1.0

时间:2013-04-27 16:24:56

标签: android api oauth linkedin scribe

我想开发一款使用LinkedIn API的Android应用程序(冰淇淋三明治)。为此,我使用Scribe库来实现OAuth流程。

我的问题是,在用户允许我的LinkedIn应用程序访问他的LinkedIn数据后,我不知道如何从Web视图获取访问令牌。

在网络上我发现了很多教程,但没有教程解释如何获得冰淇淋三明治的令牌。我在网上看到的是,我不能在用冰淇淋三明治的UI线程中创建http调用。因此,我开发了一个异步任务来获取授权URL。

在我的活动中,我有一个具有以下OnClickListener的按钮:

private OnClickListener createOnClickListener(final SocialAPI socialAPI) {
    return new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            if(PreferencesManager.getToken(AccountsActivity.this, socialAPI) == null) {
                new OAuthRequestTokenAsyncTask(AccountsActivity.this, new AsyncTaskResultHandler<String>() {
                    @Override
                    public void handleResult(String result) {
                        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(result)));
                    }

                    @Override
                    public void onError(Exception e) {
                        //nothing to do here
                    }
                }).execute(socialAPI);
            }
        }
    };
}

异步任务执行以下操作:

protected String doInBackground(SocialAPI... socialAPIs) {
    SocialAPI socialAPI = socialAPIs[0];

    OAuthService oauthService = new ServiceBuilder()
        .provider(socialAPI.apiClass)
        .apiKey(socialAPI.consumerKey)
        .apiSecret(socialAPI.consumerSecret)
        .callback(socialAPI.callbackUrl)
        .build();

    Token requestToken = oauthService.getRequestToken();
    return oauthService.getAuthorizationUrl(requestToken);
}

用户在Web视图中输入凭据后,回调操作noNewIntent再次调用原始活动:

public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    final Uri uri = intent.getData();
    System.out.println("what to do here");
}

在这个位置,我不知道如何获得访问令牌。我想我必须开发第二个异步任务,我必须在其中注入请求令牌(根据scribe文档),但是如何通过onNewIntent操作...

Verifier verifier = new Verifier("verifier");
Token accessToken = service.getAccessToken(requestToken, verifier);

顺便说一句,如果应用程序在UI线程中执行http调用,那么我会得到以下异常:

org.scribe.exceptions.OAuthConnectionException: There was a problem while creating a connection to the remote service.

提前致谢...

1 个答案:

答案 0 :(得分:1)

是的,必须开发第二个异步任务......

public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    final Uri uri = intent.getData();
    final SocialAPI socialAPI = SocialAPI.fromScheme(uri.getScheme(), uri.getSchemeSpecificPart());

    new OAuthAccessTokenAsyncTask(this, new AsyncTaskResultHandler<Token>() {
        @Override
        public void handleResult(Token result) {
            PreferencesManager.setAccessToken(AccountsActivity.this, socialAPI, result);
        }

        @Override
        public void onError(Exception e) {
            //Nothing to do here
        }
    }, uri).execute(socialAPI);
}