WebView
を使用して、クライアント アプリケーションの一部としてウェブ アプリケーションまたはウェブページを配信します。WebView
クラスは、Android の View
クラスの拡張であり、アクティビティ レイアウトの一部としてウェブページを表示できます。この値には、
ナビゲーション コントロールや
アクセスします。WebView
は、デフォルトではウェブページを表示するだけです。
WebView
は、アプリ内に必要な情報を提供するのに役立ちます
エンドユーザー契約やユーザーガイドなどの更新に関与する場合もあります。Android アプリ内で
次のフィールドを含む Activity
を作成できます。
WebView
と入力し、それを使用してオンラインでホストされているドキュメントを表示します。
WebView
は、API 呼び出しを必要とするユーザーにアプリがデータを提供する場合にも役立ちます。
メールなどのデータを取得する必要があります。この場合は
ウェブを表示する WebView
を Android アプリで作成する方が
ネットワーク リクエストを実行せずに、すべてのユーザー データを含む
データを解析して Android レイアウトにレンダリングするその代わりに
Android デバイス向けにカスタマイズしたウェブページを作成し、
ウェブページを読み込む Android アプリ内の WebView
。
このドキュメントでは、WebView
の使用を開始する方法と、
ウェブページから Android アプリのクライアントサイド コードへ JavaScript を送信する方法
ページ ナビゲーションの処理方法と、WebView
使用時のウィンドウの管理方法。
以前のバージョンの Android で WebView を操作する
アプリの最新の WebView
機能をデバイスで安全に使用するには、
追加する場合は、AndroidX
Webkit ライブラリを使用します。これは、以前のプラットフォーム バージョンでは使用できない android.webkit
API を使用するようにアプリに追加できる静的ライブラリです。
次のように build.gradle
ファイルに追加します。
dependencies { implementation("androidx.webkit:webkit:1.8.0") }
dependencies { implementation ("androidx.webkit:webkit:1.8.0") }
WebView
について
例
をご覧ください。
アプリに WebView を追加する
アプリに WebView
を追加するには、<WebView>
要素を
または、Activity
ウィンドウ全体を WebView
として設定します。
onCreate()
。
アクティビティ レイアウトに WebView を追加する
レイアウト内のアプリに WebView
を追加するには、次のコードを
アクティビティのレイアウト XML ファイル:
<WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" />
WebView
でウェブページを読み込むには、次の例に示すように loadUrl()
を使用します。
val myWebView: WebView = findViewById(R.id.webview) myWebView.loadUrl("http://www.example.com")
WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.loadUrl("http://www.example.com");
onCreate() で WebView を追加する
代わりに、アクティビティの onCreate()
メソッドでアプリに WebView
を追加するには、次のコマンドを使用します。
次のようなロジックになります。
val myWebView = WebView(activityContext) setContentView(myWebView)
WebView myWebView = new WebView(activityContext); setContentView(myWebView);
次のように、ページを読み込みます。
myWebView.loadUrl("http://www.example.com")
myWebView.loadUrl("https://www.example.com");
または、HTML 文字列から URL を読み込みます。
// Create an unencoded HTML string, then convert the unencoded HTML string into // bytes. Encode it with base64 and load the data. val unencodedHtml = "<html><body>'%23' is the percent code for ‘#‘ </body></html>"; val encodedHtml = Base64.encodeToString(unencodedHtml.toByteArray(), Base64.NO_PADDING) myWebView.loadData(encodedHtml, "text/html", "base64")
// Create an unencoded HTML string, then convert the unencoded HTML string into // bytes. Encode it with base64 and load the data. String unencodedHtml = "<html><body>'%23' is the percent code for ‘#‘ </body></html>"; String encodedHtml = Base64.encodeToString(unencodedHtml.getBytes(), Base64.NO_PADDING); myWebView.loadData(encodedHtml, "text/html", "base64");
アプリがインターネットにアクセスできる必要があります。インターネット アクセスを取得するには、次の例に示すように、マニフェスト ファイルで INTERNET
権限をリクエストします。
<manifest ... > <uses-permission android:name="android.permission.INTERNET" /> ... </manifest>
次のいずれかの方法で WebView
をカスタマイズできます。
- 全画面表示のサポートを有効にするには、
WebChromeClient
。このクラスWebView
がホストアプリの UI を変更する権限を必要とする場合にも呼び出されます。 ウィンドウの作成や閉じたり、JavaScript ダイアログを できます。このコンテキストでのデバッグの詳細については、ウェブアプリをデバッグするをご覧ください。 - コンテンツの表示に影響するイベント(フォームのエラーなど)の処理
ナビゲーションを
WebViewClient
。また、 URL の読み込みをインターセプトします。 - 変更による JavaScript の有効化
WebSettings
。 - JavaScript を使用して、挿入した Android フレームワーク オブジェクトにアクセスする
WebView
に変換します。
WebView で JavaScript を使用する
WebView
に読み込むウェブページで JavaScript を使用する場合は、
WebView
で JavaScript を有効にします。JavaScript を有効にすると、
アプリコードと JavaScript コードの間にインターフェースを作成する。
JavaScript を有効にする
デフォルトでは、JavaScript は WebView
で無効になっています。WebView
に接続された WebSettings
で有効にできます。次を使用して WebSettings
を取得します。
getSettings()
してから、有効にする
JavaScript:
setJavaScriptEnabled()
。
次の例をご覧ください。
val myWebView: WebView = findViewById(R.id.webview) myWebView.settings.javaScriptEnabled = true
WebView myWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true);
WebSettings
では、その他のさまざまな設定にアクセスできます。
便利です。たとえば、Android アプリの WebView
専用に設計されたウェブ アプリケーションを開発している場合は、setUserAgentString()
を使用してカスタム ユーザー エージェント文字列を定義し、ウェブページでカスタム ユーザー エージェントをクエリして、ウェブページをリクエストしているクライアントが Android アプリであることを確認できます。
JavaScript コードを Android コードにバインドする
Android アプリで WebView
専用のウェブ アプリケーションを開発する場合は、JavaScript コードとクライアント側 Android コードの間にインターフェースを作成できます。たとえば、JavaScript コードは
Dialog
を表示する Android コード
JavaScript の alert()
関数を使用する代わりに、
JavaScript と Android のコードの間に新しいインターフェースをバインドするには、addJavascriptInterface()
を呼び出し、JavaScript にバインドするクラス インスタンスと、クラスにアクセスするために JavaScript が呼び出すことができるインターフェース名を渡します。
例として、Android アプリに次のクラスを含めることができます。
/** Instantiate the interface and set the context. */ class WebAppInterface(private val mContext: Context) { /** Show a toast from the web page. */ @JavascriptInterface fun showToast(toast: String) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show() } }
public class WebAppInterface { Context mContext; /** Instantiate the interface and set the context. */ WebAppInterface(Context c) { mContext = c; } /** Show a toast from the web page. */ @JavascriptInterface public void showToast(String toast) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } }
この例では、WebAppInterface
クラスを使用して、ウェブページで
showToast()
を使用した Toast
メッセージ
メソッドを呼び出します。
このクラスを、WebView
で実行される JavaScript にバインドするには、次のコマンドを使用します。
addJavascriptInterface()
。次の例をご覧ください。
val webView: WebView = findViewById(R.id.webview) webView.addJavascriptInterface(WebAppInterface(this), "Android")
WebView webView = (WebView) findViewById(R.id.webview); webView.addJavascriptInterface(new WebAppInterface(this), "Android");
これにより、Android
というインターフェースが作成され、
WebView
。この時点で、ウェブ アプリケーションは
WebAppInterface
クラス。たとえば、次の HTML と JavaScript は、ユーザーがボタンをタップしたときに、新しいインターフェースを使用してトースト メッセージを作成します。
<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /> <script type="text/javascript"> function showAndroidToast(toast) { Android.showToast(toast); } </script>
JavaScript から Android
インターフェースを初期化する必要はありません。「
WebView
により、自動的にウェブページで利用可能になります。ユーザーが
ボタンをタップすると、showAndroidToast()
関数が Android
インターフェースを使用する
WebAppInterface.showToast()
メソッドを呼び出すことができます。
ページ ナビゲーションを処理する
ユーザーが WebView
のウェブページでリンクをタップすると、デフォルトでは Android は
URL を処理するアプリを起動します。通常、デフォルトのウェブブラウザが開き、
はリンク先 URL を読み込みます。ただし、デフォルトの環境では、この動作をオーバーライドして、
WebView
。リンクは WebView
内で開きます。その後、このユーザーに
ウェブページ履歴をさかのぼって移動し、
(WebView
)
ユーザーがタップしたリンクを開くには、setWebViewClient()
を使用して WebView
に WebViewClient
を提供します。ユーザーがタップしたすべてのリンクは WebView
に読み込まれます。クリックしたリンクの読み込み先をさらに制御したい場合は、shouldOverrideUrlLoading()
メソッドをオーバーライドする独自の WebViewClient
を作成します。次の例では、MyWebViewClient
が内部クラスであることを前提としています。
/Activity
。
private class MyWebViewClient : WebViewClient() { override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { if (Uri.parse(url).host == "www.example.com") { // This is your website, so don't override. Let your WebView load // the page. return false } // Otherwise, the link isn't for a page on your site, so launch another // Activity that handles URLs. Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply { startActivity(this) } return true } }
private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { if ("www.example.com".equals(request.getUrl().getHost())) { // This is your website, so don't override. Let your WebView load the // page. return false; } // Otherwise, the link isn't for a page on your site, so launch another // Activity that handles URLs. Intent intent = new Intent(Intent.ACTION_VIEW, request.getUrl()); startActivity(intent); return true; } }
次に、以下のとおり、WebView
用に新しい WebViewClient
のインスタンスを作成します。
val myWebView: WebView = findViewById(R.id.webview) myWebView.webViewClient = MyWebViewClient()
WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.setWebViewClient(new MyWebViewClient());
これで、ユーザーがリンクをタップすると、
shouldOverrideUrlLoading()
メソッド: URL ホストが一致するかどうかを確認します。
上記の例で定義されているように、特定のドメインを指定します。一致する場合は
メソッドは false を返し、URL の読み込みをオーバーライドしません。これにより、
WebView
は通常どおり URL を読み込みます。URL ホストが一致しない場合、Intent
が作成され、URL 処理用のデフォルトの Activity
が起動されます。この Activity
は、ユーザーのデフォルトのウェブブラウザに解決されます。
カスタム URL を処理する
WebView
は、リソースのリクエスト時とリンクの解決時に制限を適用します
実装する方法を学びましたたとえば、shouldOverrideUrlLoading()
や shouldInterceptRequest()
などのコールバックを実装すると、WebView
は有効な URL に対してのみコールバックを呼び出します。
たとえば、WebView
が shouldOverrideUrlLoading()
メソッドを呼び出さないことがあります。
次のようなリンクがあります。
<a href="showProfile">Show Profile</a>
上記の例のような無効な URL は WebView
で不整合に処理されるため、代わりに適切な形式の URL を使用することをおすすめします。組織で利用しているドメインのカスタム スキームまたは HTTPS URL を使用できます。
できます。
前の例のようにリンクに単純な文字列を使用する代わりに、 次のようなカスタム スキームを使用します。
<a href="example-app:showProfile">Show Profile</a>
その後、この URL を shouldOverrideUrlLoading()
メソッドで次のように処理できます。
これを次のように使用します。
// The URL scheme must be non-hierarchical, meaning no trailing slashes. const val APP_SCHEME = "example-app:" override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { return if (url?.startsWith(APP_SCHEME) == true) { urlData = URLDecoder.decode(url.substring(APP_SCHEME.length), "UTF-8") respondToData(urlData) true } else { false } }
// The URL scheme must be non-hierarchical, meaning no trailing slashes. private static final String APP_SCHEME = "example-app:"; @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith(APP_SCHEME)) { urlData = URLDecoder.decode(url.substring(APP_SCHEME.length()), "UTF-8"); respondToData(urlData); return true; } return false; }
shouldOverrideUrlLoading()
API は主に、特定の URL のインテントを起動することを目的としています。実装する際は、WebView
ハンドルの URL に対して false
を返すようにしてください。ただし、起動インテントに限定されません。上記のコードサンプルでは、起動インテントを任意のカスタム動作に置き換えることができます。
ウェブページの履歴を操作する
WebView
が URL の読み込みをオーバーライドすると、アクセスしたウェブページの履歴が自動的に蓄積されます。履歴を前後に移動するには、goBack()
と goForward()
を使用します。
たとえば、Activity
でデバイスの [戻る] ボタンを使用して後方に移動する方法は次のとおりです。
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { // Check whether the key event is the Back button and if there's history. if (keyCode == KeyEvent.KEYCODE_BACK && myWebView.canGoBack()) { myWebView.goBack() return true } // If it isn't the Back button or there isn't web page history, bubble up to // the default system behavior. Probably exit the activity. return super.onKeyDown(keyCode, event) }
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // Check whether the key event is the Back button and if there's history. if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) { myWebView.goBack(); return true; } // If it isn't the Back button or there's no web page history, bubble up to // the default system behavior. Probably exit the activity. return super.onKeyDown(keyCode, event); }
アプリで AndroidX AppCompat
1.6.0 以降を使用している場合は、前のスニペットをさらに簡素化できます。
onBackPressedDispatcher.addCallback { // Check whether there's history. if (myWebView.canGoBack()) { myWebView.goBack() } }
onBackPressedDispatcher.addCallback { // Check whether there's history. if (myWebView.canGoBack()) { myWebView.goBack(); } }
canGoBack()
メソッドは、ユーザーがアクセスできるウェブページ履歴がある場合に true を返します。同様に
canGoForward()
を使用して次のことを行えます。
転送履歴があるかどうかをチェックします。このチェックを行わない場合、ユーザーが履歴の最後に到達すると、goBack()
と goForward()
は何も行いません。
デバイス設定の変更を処理する
アクティビティの状態変化は、実行時にデバイスの構成が変化したときに発生します。
ユーザーがデバイスを回転させたときやインプット メソッド エディタを閉じたときなど、変更したとき
(IME)。これらの変更により、WebView
オブジェクトのアクティビティが破棄され、
新しいアクティビティが作成される。これにより、読み込まれる新しい WebView
オブジェクトも作成され、
破棄されたオブジェクトの URL。アクティビティのデフォルトの動作を変更するには、
マニフェスト内の orientation
の変更の処理方法を変更できます。関連資料
実行時の構成変更の処理については、構成の処理
変更します。
ウィンドウを管理する
デフォルトでは、新しいウィンドウを開くリクエストは無視されます。このことは
JavaScript またはリンクの target 属性によって開かれます。WebChromeClient
をカスタマイズして、複数のウィンドウを開く動作をご自身で提供できます。
アプリのセキュリティを高めるには、アプリの起動時に表示されるポップアップや新しいウィンドウを
あります。この動作を最も安全に実装する方法は、setSupportMultipleWindows()
に "true"
を渡しつつ、setSupportMultipleWindows()
が依存する onCreateWindow()
メソッドをオーバーライドしないことです。このロジックにより、リンクで target="_blank"
を使用するページは読み込まれなくなります。