Android:foursquareでOAuth2認証を行う(その3)

さて、前回までで、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を呼び出し放題です。(まだあんまりやってないけど・・・)


タグ Android | パーマリンク.

コメント・トラックバック一覧

  1. Pingback: Android:foursquareでOAuth2認証を行う(その2) | 自転車で通勤しましょ♪ブログ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です