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に対応する

qiita.com

videoタグのフルスクリーンに対応する

www.monstertechnocodes.com

全ソース

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>

こんなの実装しないと動かないのかというものがいくつかあるけどそういうものと思うしかない。以上です