さて、前回までで、foursquareで認証したら、コールバックURLにリダイレクトされて、そのURLをintent-filterで拾うところまで書きました。あともうちょっとでアクセストークンが手に入ります。。。
Login.classのonNewIntentメソッドがコールバックURLをintent-filterでフィルタされることによって呼ばれました。
そのintentには、コールバックURLと、認証コードが入ってます。それを取り出して、アクセストークン取得用のURLにアクセスします。その処理はTokenGetTaskで非同期に行っています。実験した機種はXOOMなのですが、Android 3.0からは通信は非同期に行わないと例外が発生しました。ANR対策は絶対にしろということなんでしょう。
途中、手を抜いているコードもありますがご勘弁。
また、アクセストークンを取得しているOAuthClient.getTokenFromAuthorizationCodeメソッドは、その2に記載しています。(これもまた参照情報のまんまに近いですが)
/**
* foursquareからのリダイレクトを受けてコールバックされる処理
*/
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Uri uri = intent.getData();
if (uri == null) {
return;
}
String code = uri.getQueryParameter("code");
if (code == null) {
showToast("エラー");
return;
}
// メインスレッドでネットワーク通信したら例外発生したのでAsyncTaskで対応
new TokenGetTask(this).execute(code);
}
private class TokenGetTask extends AsyncTask<String, Void, String> {
private ProgressDialog mProgressDialog;
public TokenGetTask(Context context) {
mProgressDialog = new ProgressDialog(context);
}
@Override
protected String doInBackground(String... codes) {
String token = "";
String code = codes[0];
try {
// アクセストークンを取得
token = OAuthClient.getTokenFromAuthorizationCode(code);
} catch (ClientProtocolException e) {
Log.e(TAG, e.getMessage());
} catch (IOException e) {
Log.e(TAG, e.getMessage());
} catch (JSONException e) {
Log.e(TAG, e.getMessage());
}
return token;
}
@Override
protected void onPostExecute(String result) {
if ("".equals(result)) {
// エラーでトークンの取得に失敗
showToast("エラー");
} else {
// トークンをPreferencesに保存
OAuthTokenStore store = new OAuthTokenStore(getApplicationContext());
store.updateAccessToken(result);
showToast("アクセストークンを保存しました");
mProgressDialog.dismiss();
// アクセストークンを求めた最初のActivityを起動
startApp();
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog.setMessage(getString(R.string.now_loading));
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.show();
}
}
private void showToast(String text) {
Toast.makeText(this, text, Toast.LENGTH_LONG).show();
}
private void startApp() {
Intent i = new Intent(this, Main.class);
startActivity(i);
finish();
}
以上で、foursquareからアクセストークンを取得して、Preferencesに保存するまでの処理でした。
これでfoursquareのAPIを呼び出し放題です。(まだあんまりやってないけど・・・)


