今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

Google Oauth2 で GoogleAuthException: Unknown が再発した

この前、「GoogleAuthUtil.getToken()でGoogleAuthException: Unknown が発生する問題を解決できた」ってのを書いたけど、またまた再発した。

再発した原因は、Googleのアカウント権限のページで、該当のアプリのアクセス権を取り消したから。再認証のテストをしたかったので。

アプリのアクセス権を取り消して、再びアプリからアクセスすれば認証画面が表示されるかと思ったら大間違い。またまた GoogleAuthException: Unknown が発生してしまった。

アカウント権限に該当のアプリが存在しない時は、本来なら UserRecoverableAuthException: NeedPermission が発生するはずなのに、なんらかの原因で GoogleAuthException: Unknown が発生していると思われ。

トークンを取得できてないままでアプリからGoogleのサービスにアクセスしたところで、LogCat に UserRecoverableAuthException: NeedPermission が出力された。

そこで、例外を処理するコードを追加してみた。

        try {
            // google にアクセス
        } catch (UserRecoverableAuthException e) {
            Intent i = ue.getIntent();
            startActivityForResult(i, REQUEST_AUTHORIZATION);
        } catch (Exception e) {
            // ほげほげ
        }

しかし、コンパイルエラー。チェック例外である UserRecoverableAuthException を発生しないメソッドしか使ってないらしい。

強制的にキャストしてみた。

        try {
            // google にアクセス
        } catch (Exception e) {
            UserRecoverableAuthException ue = (UserRecoverableAuthException)e;
            Intent i = ue.getIntent();
            startActivityForResult(i, REQUEST_AUTHORIZATION);
        }

すると、ClassCastException が発生。throw されたのは、UserRecoverableAuthIOException ではなく UserRecoverableAuthIOException だった。

そこで、getCause()で発生原因の例外を取得してみたら、今度はうまくいった。

        try {
            // google にアクセス
        } catch (Exception e) {
            String s = e.getMessage();
            if (s.contains("NeedPermission")) {
                UserRecoverableAuthException ue = (UserRecoverableAuthException)e.getCause();
                Intent i = ue.getIntent();
                startActivityForResult(i, REQUEST_AUTHORIZATION);
        }

こちらでは問題なく認証画面が表示され、ユーザー側で何度かOKをタップしてやると、トークンを取得できた。

結局、アプリ起動時に getToken() したときに GoogleAuthException: Unknown が発生していたのは、何が悪いのかわからんまま。

トークンを取得できないからとその場で悩み続けてないで、トークンがなくても Google のサービスにアクセスしてみると、そちらで UserRecoverableAuthException が投げられることもあるみたいなので、試してみるといいのかも。