android WebViewアプリの作り方まとめとく
ただWebサイトを表示するだけのアプリを作ろうとするだけでも意外と実装しないとならないことが多いのがアプリの世界?次回のために作り方をまとめておく
WebViewを作ってサイトを表示する
指定URLを表示するだけのアプリ。JavaScriptは有効にしておく
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
MainActivity.java
public class MainActivity extends AppCompatActivity { WebView mWebView; @SuppressLint("SetJavaScriptEnabled") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebView = (WebView)findViewById(R.id.webView); mWebView.loadUrl("https://www.google.com"); mWebView.getSettings().setJavaScriptEnabled(true); } }
activity_main.xml
<WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" />
リンクに対応する
MainActivity.java
protected void onCreate(Bundle savedInstanceState) { ・・・ mWebView.setWebViewClient(new CustomWebViewClient()); } class CustomWebViewClient extends WebViewClient { }
クッキーの有効化
MainActivity.java
protected void onCreate(Bundle savedInstanceState) { ・・・ mWebView.setDomStorageEnabled(new CustomWebViewClient()); }
クッキーの値を取得する
class CustomWebViewClient extends WebViewClient { ・・・ @Override public void onPageCommitVisible(WebView view, String url) { String cookie = CookieManager.getInstance().getCookie(url); Log.d("",cookie); } }
戻るボタンでブラウザバック
MainActivity.java
public class MainActivity extends AppCompatActivity { ・・・ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_BACK) { mWebView.goBack(); } return true; } }
メールや電話の起動リンクに対応
class CustomWebViewClient extends WebViewClient { public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("mailto:") || url.startsWith("tel:")) { Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(url)); startActivity(intent); return true; } else { return false; } } }
SSLエラーやhttpとhttpsの混在ページを読み込む
もちろん不要なら対応しない方がいいけど
・・・ mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); ・・・ class CustomWebViewClient extends WebViewClient { ・・・ @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); } }
Pull To Refreshを実装する
activity_main.xml
<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/refresh" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.widget.SwipeRefreshLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity { ・・・ SwipeRefreshLayout mRefresh; protected void onCreate(Bundle savedInstanceState) { ・・・ mRefresh = (SwipeRefreshLayout) findViewById(R.id.refresh); mRefresh.setOnRefreshListener(refreshListener); } class CustomWebViewClient extends WebViewClient { ・・・ @Override public void onPageCommitVisible(WebView view, String url) { MainActivity.this.mRefresh.setRefreshing(false); } } }
他のサイトは表示したくない
class CustomWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (Uri.parse(url).getHost().equals("example.com")) { return false; } else { return true; } } }
input type fileに対応する
videoタグのフルスクリーンに対応する
全ソース
MainActivity.java
package xxx.yyy.zzz; import android.annotation.SuppressLint; import android.content.Intent; import android.net.Uri; import android.net.http.SslError; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.webkit.CookieManager; import android.webkit.SslErrorHandler; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends AppCompatActivity { WebView mWebView; SwipeRefreshLayout mRefresh; @SuppressLint("SetJavaScriptEnabled") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRefresh = (SwipeRefreshLayout) findViewById(R.id.refresh); mRefresh.setOnRefreshListener(refreshListener); mWebView = (WebView)findViewById(R.id.webView); mWebView.loadUrl("https://www.google.com"); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.getSettings().setDomStorageEnabled(true); mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); mWebView.setWebViewClient(new CustomWebViewClient()); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_BACK) { mWebView.goBack(); } return true; } private SwipeRefreshLayout.OnRefreshListener refreshListener = new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { mWebView.reload(); } }; class CustomWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("mailto:") || url.startsWith("tel:")) { Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(url)); startActivity(intent); return true; } else if (Uri.parse(url).getHost().equals("example.com")) { return false; } else { return true; } } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); } @Override public void onPageCommitVisible(WebView view, String url) { String cookie = CookieManager.getInstance().getCookie(url); Log.d("",cookie); MainActivity.this.mRefresh.setRefreshing(false); } } }
activity_main.xml
<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/refresh" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.widget.SwipeRefreshLayout>
こんなの実装しないと動かないのかというものがいくつかあるけどそういうものと思うしかない。以上です