web-dev-qa-db-ja.com

Android実行されていないためのWebViewのshouldOverrideUrlLoading

-編集:ソリューションが見つかりました-
検索を何度か行った結果、ある人(私は文字通り1人)が代わりにonPageLoad()を使用したと言いました。私の目的には完璧に機能しました。違いは、onPageLoad()がshouldOverrideUrlLoadingよりも遅く実行されることですが、コードに違いはありません。

OAuth Androidアプリ用にTwitter認証を設定しようとしていますが、これまでのところ、ユーザーを認証URLに正常に送信できましたが、私が今やろうとしているのは、コールバックへのリダイレクトをインターセプトすることです(これは404エラーにつながるだけで、コールバックURLはサーバーに関連するページを持たないでしょう)。 URLがコールバックの場合、URLからOAuth Verifierを抽出します。このコードでWebViewをセットアップします。

view = (WebView)findViewById(R.id.twitterWbVw);
view.setWebViewClient(new WebViewClient(){
    @Override
    public boolean shouldOverrideUrlLoading(WebView wView, String url)
    {
        String urlHolder;
        String[] verifExtrctr;
        urlHolder = url.substring(0, url.indexOf('?'));
        System.out.println("url");
        if(urlHolder.equalsIgnoreCase(CALLBACK_URL))
        {
            verifExtrctr = urlHolder.split("?");
            verifExtrctr = verifExtrctr[2].split("=");
            if(verifExtrctr[0].equalsIgnoreCase("oauth_verifier"))
            {
                params[5] = verifExtrctr[1];
                return true;
            }
            else
            {
                System.out.println("Inocorrect callback URL format.");
            }
        }
        else    
        {
            wView.loadUrl(url);
        }
        return true;
    }
});
view.loadUrl(urlAuthorize.toExternalForm());

事はSystem.out.println( "url");(これはデバッグに使用しています)実行しません!だから私はほとんどドライですアイデア、および同様の問題を持つ人を見つけることができません。認証URLは正常に処理され、アプリを正常に認証できますが、何らかの理由でコールバックURLへのリダイレクトがインターセプトされることはありません。任意の助けをいただければ幸いです、それが重要な場合、これは私のonResume()にあります。

21
Justin

これまでの答えとコメントのおかげで、正しい方向を示してくれたおかげで、これを行う合理的な方法だと思うことがわかりました。

カスタムWebViewClientでonPageStartedとonPageFinishedをオーバーライドしました。コードは次のようになります...

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
  if (pendingUrl == null) {
    pendingUrl = url;
  }
}

@Override
public void onPageFinished(WebView view, String url) {
  if (!url.equals(pendingUrl)) {
    Log.d(TAG, "Detected HTTP redirect " + pendingUrl + "->" + url);
    pendingUrl = null;
  }
}

もちろん、Log.dとともに、リダイレクトの検出時に実行する特定のコードを配置します。

14
Maks

これに出くわした人のために、メソッドshouldOverrideUrlLoading(WebView view, WebResourceRequest request)が呼び出されていない場合、minSdkVersionを検索します。 API 24以下を使用する場合は、shouldOverrideUrlLoading(WebView view, String url)を使用する必要があります。

0
metodieva