0

アプリケーションの 1 つでGoogle+ にログインしようとしています。WebViewユーザーのログインに使用していますauth。トークンを取得した後、名前、メールアドレスなどのユーザー情報を取得したいと思います。

AccountManagerのシナリオを知っています。

しかし、既に保存されているアカウントを使用する代わりに、ユーザーに を使用してログインしてWebViewもらい、ログインに成功した後、彼の電子メール ID を情報として取得します。

私は短いコードをたどろうとしています。しかし、401例外が発生しています。java.io.IOException: Unauthorized

WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://mail.google.com");
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        // TODO Auto-generated method stub
        super.onPageStarted(view, url, favicon);
        Log.d("Home", "Url :" + url);
        String requestToken = "";
        if (url.contains("auth=")) {
            requestToken += url.substring(url.indexOf("auth=") + 5);
            Log.d("Home", "Request Token : " + requestToken);
            requestUrl = "https://www.googleapis.com/oauth2/v1/userinfo?access_token="
                    + requestToken;
            view.stopLoading();
            new CustomThread().start();
        }

    }

    public void onPageFinished(WebView view, String url) {
        // Log.d("Home", "Url :" + url);
        // Log.d("Home", view.getUrl());
    }
});

public class CustomThread extends Thread {
    @Override
    public void run() {
        DefaultHttpClient httpClient = new DefaultHttpClient();

        HttpResponse response;
        try {
            response = httpClient.execute(new HttpGet(requestUrl));
            StatusLine statusLine = response.getStatusLine();
            if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                response.getEntity().writeTo(out);
                out.close();
                Log.d("Home", "Response : " + out.toString());

                CookieSyncManager.getInstance().sync();
                // Get the cookie from cookie jar.
                String cookie = CookieManager.getInstance().getCookie(
                        requestUrl);
                if (cookie == null) {
                    Log.d("Home", "Cookie is Null");
                    return;
                }
                // Cookie is a string like NAME=VALUE [; NAME=VALUE]
                String[] pairs = cookie.split(";");
                for (int i = 0; i < pairs.length; ++i) {
                    String[] parts = pairs[i].split("=", 2);
                    // If token is found, return it to the calling activity.
                    if (parts.length == 2
                            && parts[0].equalsIgnoreCase("oauth_token")) {
                        Log.d("Home", "Token :" + parts[1]);
                    }
                }
            } else {
                Log.d("Home", "Error : " + statusLine.getStatusCode());
                // Closes the connection.
                response.getEntity().getContent().close();
                throw new IOException(statusLine.getReasonPhrase());
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
4

2 に答える 2

0

WebView を使用する代わりに、Google+ サインインの場合、PlusClient を使用する方がはるかに簡単で、すべてがネイティブ エクスペリエンスで動作します。https://developers.google.com/+/mobile/android/sign-inを参照してください

于 2013-09-19T16:54:49.593 に答える