WebView+H 5ハイブリッド開発まとめ
3432 ワード
現在、androidが独自のWebViewコントロールを採用し、Html 5をロードしてハイブリッド開発を実現するAppアプリケーションがあります.みんなは開発の中できっと多くの穴に出会ったことがあって、いくつかの問題を総括するつもりで、以下の通りです: java呼び出しjsはどのように実現しますか? Android4.2 WebViewのaddJavascriptInterface脆弱性ソリューションをダウンロードしますか? Android4.4ファイルのアップロードをサポートしますか? WebViewはどのようにしてドロップダウンのリバウンド効果を実現しますか? WebViewはどのようにクッキー管理を実現しますか?
すべての解決方法のソースコードWebViewH 5 Mutual
最初の質問
AndroidでJSコードを呼び出す方法は2つあります. (1)WebViewのloadUrl() (2)WebViewのevaluateJavascript()
evaluateJavascriptメソッドはandroid 4.4以降に提供されるメソッドで、より効率的です.実行プロセスではページはリフレッシュされず、loadUrlではインタフェースがリフレッシュされます.
解決策 2つの方法を混合して使用します.すなわち、Android 4.4以下はloadUrl方法、Android 4.4以上はevaluateJavascript方法を使用します.
2番目の質問
3番目の質問
WebChromeClientのopenFileChooser()メソッドを書き換える.
4番目の質問
5番目の質問
CookieManagerを使用して、CookieをWebViewに同期します.APIが21以下の場合、CookieManagerの前にCookieSyncManagerを呼び出す必要がある.createInstance(context)メソッド.
すべての解決方法のソースコードWebViewH 5 Mutual
最初の質問
AndroidでJSコードを呼び出す方法は2つあります. (1)WebViewのloadUrl() (2)WebViewのevaluateJavascript()
evaluateJavascriptメソッドはandroid 4.4以降に提供されるメソッドで、より効率的です.実行プロセスではページはリフレッシュされず、loadUrlではインタフェースがリフレッシュされます.
解決策 2つの方法を混合して使用します.すなわち、Android 4.4以下はloadUrl方法、Android 4.4以上はevaluateJavascript方法を使用します.
public void callJs(String js, final ValueCallback callback) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mWebView.evaluateJavascript(js, new ValueCallback() {
@Override
public void onReceiveValue(String value) {
if (callback != null)
callback.onReceiveValue(value);
}
});
} else {
mWebView.loadUrl(js);
}
}
2番目の質問
3番目の質問
WebChromeClientのopenFileChooser()メソッドを書き換える.
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) {
LogUtils.i(TAG, "openFileChooser>=5.0");
if (AgentWebUtils.isOverriedMethod(mWebChromeClient, "onShowFileChooser", ChromePath + ".onShowFileChooser", WebView.class, ValueCallback.class, FileChooserParams.class)) {
return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);
}
webview.setWebChromeClient(new WebChromeClient() {
// For Android < 3.0
public void openFileChooser(ValueCallback valueCallback) {
***
}
// For Android >= 3.0
public void openFileChooser(ValueCallback valueCallback, String acceptType) {
***
}
//For Android >= 4.1
public void openFileChooser(ValueCallback valueCallback,
String acceptType, String capture) {
***
}
// For Android >= 5.0
@Override
public boolean onShowFileChooser(WebView webView,
ValueCallback filePathCallback,
WebChromeClient.FileChooserParams fileChooserParams) {
***
return true;
}
});
4番目の質問
5番目の質問
CookieManagerを使用して、CookieをWebViewに同期します.APIが21以下の場合、CookieManagerの前にCookieSyncManagerを呼び出す必要がある.createInstance(context)メソッド.
public static boolean syncCookie(Context context, String url, String cookie) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
CookieSyncManager.createInstance(context);
}
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setCookie(url, cookie);// , session id "key=value" cookie
String newCookie = cookieManager.getCookie(url);
return TextUtils.isEmpty(newCookie)?false:true;
}