さて、前回までで、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を呼び出し放題です。(まだあんまりやってないけど・・・)
Pingback: Android:foursquareでOAuth2認証を行う(その2) | 自転車で通勤しましょ♪ブログ