我想开发一款使用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.
提前致谢...
答案 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);
}