13001

[code]

    package com.example.makki.webviewhooktest;
    
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.content.Intent;
    
    public class MainActivity extends Activity {
        public void onCreate(Bundle savedInstanceState) {
    
            WebView webview = new WebView(this);
            webview.setWebViewClient(new WebViewClient() {
    
                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon) {
                    super.onPageStarted(view, url, favicon);
                }
    
                @Override
                public void onPageFinished(WebView view, String url) {
                    super.onPageFinished(view, url);
                }
    
                public boolean shouldOverrideUrlLoading(WebView webView, String url) {
                    //URLがYahooのトップページだったらインテントする
                    if (url.equals("http://www.yahoo.co.jp")) {
                        Intent intent = new Intent(MainActivity.this, TestActivity.class);
                        startActivity(intent);
                        return true;
                    }
                    //エラーが出るので追加した。
                    return false;
                }
            });
        }
    }
    
[/code]

質問です。  
WebViewでリクエストをフックして強制的に任意のURLに遷移させたいです。

下記の情報を参考にして試そうとしていますが、エラーが出てしまいます。  
<http://6rats.blog62.fc2.com/blog-entry-108.html>  
①37行目でエラーが出るので、return false;を追加しました。理由を理解していないので教えて下さい。  
②実行するとエミュレーターで「unfortunately, <アプリ名> has stopped.」が出ます  
解決方法を教えて下さい。  
<http://hyottokoaloha.hatenablog.com/entry/2015/03/24/214407>  
マニュフェストファイルにパーミッションの追加はしました。activity_main.xmlは初期状態のままです。

③Bitmapは任意の画像を表示するクラスでしょうか？それだと、画像ファイルを用意する記述も足りないですね。

④もし役立ちそうな参考URLなどがあったら教えていただきたいです。

勉強中なので、  
よろしくお願いいたしますm(_ _)m


CC BY-SA 3.0
2015-07-31T08:37:35.287
12879
2015-08-03T16:48:47.393
2015-07-31T11:26:13.380
7290
10715
question
android java android-webview
WebViewでリクエストをフックして強制的に任意のURLに遷移させたい


質問内容へ回答する前に、動作するコードを記載しておきます。

MainActivity.java

[code]

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            WebView webView = (WebView) findViewById(R.id.webView);
            webView.setWebViewClient(new WebViewClient() {
    
                @Override
                public boolean shouldOverrideUrlLoading(WebView webView, String url) {
                    Log.d("TAG", "called shouldOverrideUrlLoading " + url);
                    // モバイル版トップページにリダイレクトされるので
                    // http://www.yahoo.co.jp/ はロードされない
                    if (url.equals("http://m.yahoo.co.jp/")) {
                        Log.d("TAG", "equals");
                        Intent intent = new Intent(MainActivity.this, TestActivity.class);
                        startActivity(intent);
                        return true;
                    }
    
                    return false;
                }
            });
    
            webView.loadUrl("http://www.yahoo.co.jp");
        }
    }
    
[/code]

activity_main.xml

[code]

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  xmlns:tools="http://schemas.android.com/tools"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical">
    
      <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
      </WebView>
    </LinearLayout>
    
[/code]

①  
`public **boolean** shouldOverrideUrlLoading(WebView webView, String url)`  
という宣言の通り、メソッドからリータンする際には必ずboolean型の戻り値を伴う必要があります。  
trueを返すべきかfalseを返すべきかは[Javadoc](http://developer.android.com/reference/android/webkit/WebViewClient.html#shouldOverrideUrlLoading\(android.webkit.WebView,%20java.lang.String\))
に記載されています。  
参考にされたサイトにも記載がありますね。

>
> returnがbooleanなのですが、別のアクティビティにインテントする場合など、ページのロード自体はもうしない場合はtrueを、ページをロードする場合はfalseを返すようにしてください。

②  
ログに例外が出力されていると思います。今回のソースですと、`onCreate`メソッド内で、`super.onCreate()`を呼んでいないため例外が発生します。  
以下のような出力になっているはずです。

[code]

    android.util.SuperNotCalledException: Activity {yukihane.sofwebview/yukihane.sofwebview.WebViewActivity} did not call through to super.onCreate()
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2254)
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
    ...
    
[/code]

ちなみに、Android Studioを使用していれば、(実行せずとも)エディタが警告してくれますので早期に問題を発見できます。

③  
`public void onPageStarted(WebView view, String url, **Bitmap** favicon)`  
についてであれば、これはサーバから受信したファビコンです。ファビコンについて自身のプログラムで取り扱う必要が無いのであれば意識する必要はありません。

④  
何はともあれ、公式サイトは確認すべきでしょう。  
今回の件ですと、  
[Building Web Apps in WebView - Handling Page
Navigation](http://developer.android.com/guide/webapps/webview.html#HandlingNavigation)  
に解説があります。

[日本語訳](http://www.techdoctranslator.com/android/webapps/webview#HandlingNavigation)を公開されている方もいらっしゃいます。


CC BY-SA 3.0
2015-08-03T16:48:47.393
13001
2015-08-03T16:48:47.393
2808
12879
answer