32

ウェブビューに表示されたら、リダイレクト URL をインターセプトして OAuth 認証を行うアクティビティがあります。ただし、何らかの理由で onPageFinished 関数が何らかの理由で 2 回呼び出され、アプリケーションが本当に台無しになります。コードは次のとおりです。

public class WebViewActivity extends Activity {
private WebView gWebView;
final String REDIRECT_URI = "https://localhost:5000/receive_code";
final String CLIENT_ID = "can't post it here";
final String CLIENT_SECRET = "can't post it here";
final String SCOPE = "basic names genomes analyses";
Hashtable<String, String> riskPairs;

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.webview);

    gWebView = (WebView) findViewById(R.id.webView1);

    gWebView.loadUrl("https://api.23andme.com/authorize/?redirect_uri="
            + REDIRECT_URI + "&response_type=code&client_id=" + CLIENT_ID
            + "&scope=" + SCOPE);

    Log.d("WEBVIEW", "got to webpage");

    gWebView.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            if (url.startsWith(REDIRECT_URI)) {
                Log.d("WEBVIEW", "onpagefinished is called");
                System.out.println("got to override");
                if (url.indexOf("code=") != -1) {
                    //if the query contains code
                    String queryString = null;
                    try {
                        queryString = new URL(url).getQuery();
                    } catch (MalformedURLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println(queryString);
                    String[] params = queryString.split("&");
                    String code = null;
                    for (String param : params) {
                        if (param.startsWith("code=")) {
                            code = param.substring(param.indexOf('=') + 1);
                        }
                    }
                    gWebView.setVisibility(View.GONE);
                    new PostRequest().execute(code);
                    // don't go to redirectUri
                }
            }
        }
    });


}
class PostRequest extends AsyncTask<String,Void,String>{ code getting client data...}

PSこれを重複としてマークしないでください...私はStackOverflowで同様の質問を読みましたが、ShouldOverrideUrlLoadingの呼び出しは機能しません(最初にonPageFinished()を使用した理由です)。

4

8 に答える 8

35

onPageStarted メソッドが onPageFinished を開始した後に URL が正常であるが、onPageStarted が開始された後に URL がリダイレクトされる場合は、shouldOverrideUrlLoading を開始してから onPageFinished を実行します。読み込み中の URL がリダイレクトされているかどうかを確認する必要があります。

private boolean isRedirected;

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {   

  if (!isRedirected) {      
    //Do something you want when starts loading
  }

  isRedirected = false;
}

URL がリダイレクトされると、コールバックがこの関数を開始します

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {

  view.loadUrl(url);
  isRedirected = true;
  return true;
}

onPageFinished で何かを行う前に、コールバックが shouldOverrideUrlLoading メソッドに入ったかどうかを確認してください

@Override
public void onPageFinished(WebView view, String url) {

  if (!isRedirected) {
    //Do something you want when finished loading 
  }
}
于 2014-08-28T11:18:54.970 に答える
2

何らかの理由で、ロードされた URL が機能していない場合、Android は onPageFinished() を 2 回 (および onPageStarted() を 3 回!) 呼び出します。一時的な解決策は、redirect_uri を実際の Web サイトの URL に変更することです。今回はhttps://www.google.com/に変更しました(笑、Googleごめんなさい)。onPageFinished は一度だけ呼び出されます。

しかし、ロードされた URL が機能していない場合に webview の動作が異なる理由と、redirect_uri を google.com に変更するよりも良い解決策は何かについて、まだ回答が必要です。

于 2013-08-18T19:53:10.510 に答える