1

私はGmailへのログインを使用するアプリケーションを開発しています。すべてのチュートリアル、下にタグ付けされたスタックオーバーフローの質問、およびGoogleで利用可能なドキュメントを調べ、最後にサンプルOAuth 2.0のGoogleの公式ドキュメントに記載されているガイドラインに従いました. クライアント ID と、インストール済みアプリケーション、つまり Android に必要なすべてのものを作成しました。これまでのすべてが正常に機能し、ユーザーから許可を得るために電話をかけました。その後、のよう になり、次のようなことを言いました。.2日ほど解決策を探していますが、私の問題に対する良い答えを得ることができません.これが私が止められたコードです.OAuth 2.0 WebViewAccesstoken4/cR7XXXXXXXXXXXXXXXWebViewPlease copy this code,switch to your application and paste it hereWebview

Main.javaユーザーがOptionMenuログインする場所。ユーザーがクリックWebViewすると開き、gmail に入ります。

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Main extends Activity {
    public static String REQUEST = "https://accounts.google.com/o/oauth2/auth?"
            + "client_id=XXXXXXXXXXX-gxxxx.apps.googleusercontent.com&"
            + "redirect_uri=urn:ietf:wg:oauth:2.0:oob&"
            + "scope=https://mail.google.com/mail/feed/atom&"
            + "response_type=code&" + "access_type=online";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
        case 0:
            if (requestCode != RESULT_OK || data == null) {
                return;
            }
            String token = data.getStringExtra("token");
            if (token != null) {

            }
            return;
        }
        super.onActivityResult(requestCode, resultCode, data);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.item1:
            Intent intent_obj2 = new Intent(Main.this, Webview.class);
            intent_obj2.setData(Uri.parse(REQUEST));
            startActivityForResult(intent_obj2, 0);
            return true;
            }
        return super.onOptionsItemSelected(item);
    }
}

Webview.java

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.view.Window;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class Webview extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_PROGRESS);
        final WebView wb_obj = new WebView(this);
        setContentView(wb_obj);
        wb_obj.getSettings().setJavaScriptEnabled(true);
        Intent intent = getIntent();
        if (intent.getData() != null) {
            wb_obj.loadUrl(intent.getDataString());
        }

        wb_obj.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                setProgress(newProgress * 10000);
            }

        });
        wb_obj.setWebViewClient(new WebViewClient() {

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                setTitle(url);
                System.out.println(url);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                System.out.println("in onPageFinsihed");

                /*CookieSyncManager.getInstance().sync();
                String s_cookie = CookieManager.getInstance().getCookie(url);
                if (s_cookie == null) {
                    System.out.println(s_cookie);
                    return;
                }else{

                String web_title = wb_obj.getTitle().toString();
                System.out.println("web tile" + web_title);

                if (web_title.equalsIgnoreCase("Request for Permission")) {

                } else {

                    String[] s_webtitle = web_title.split("=", 2);
                    String access_token = s_webtitle[1].toString();
                    //System.out.println("Access token" + access_token);
                    startActivity(new Intent(Webview.this, Main.class));
                    finish();
                }*/
                }

        });

    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        startActivity(new Intent(Webview.this, Main.class));
    }
}

Webview.java に従ってfinish()、現在のアクティビティが強制終了されるように呼び出しましたが、これはこのアプリで発生していないため、トークンを取得しonAcitivityResult()ます。回答を共有してください。ありがとうございます。

4

3 に答える 3

-1

urn:ietf:wg:oauth:2.0:oob& の代わりに「localhost:port」をリダイレクト URI として使用することを検討してください (詳細については、https ://developers.google.com/youtube/v3/guides/authentication#installed- を参照してください)。 apps ) を呼び出して、この URL が webview にロードされていることをコールバックでトラップします: public boolean shouldOverrideUrlLoading (WebView view, String url)。

于 2014-10-25T13:45:56.433 に答える
-1

OAuth2 トークンを使用して Gmail API にアクセスする別の方法については、次の投稿の回答を検討してください: OAuth and Java (connecting to GMail)

于 2014-12-25T06:07:43.143 に答える