package com.warmlight.voicepacket.web;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Build;
import android.os.Message;
import android.support.v4.math.MathUtils;
import android.util.AttributeSet;
import android.view.View;
import android.webkit.ConsoleMessage;
import android.webkit.GeolocationPermissions;
import android.webkit.JsPromptResult;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import java.io.File;
import java.net.URLDecoder;
import java.util.Hashtable;
import retrofit2.http.HTTP;
public class Html5WebView extends WebView {
private Context mContext;
public Html5WebView(Context context) {
super(context);
mContext = context;
init();
}
public Html5WebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public Html5WebView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private void init() {
WebSettings mWebSettings = getSettings();
mWebSettings.setSupportZoom(true);
mWebSettings.setLoadWithOverviewMode(true);
mWebSettings.setUseWideViewPort(true);
mWebSettings.setDefaultTextEncodingName("utf-8");
//适配https图片显示
mWebSettings.setLoadsImagesAutomatically(true); // 支持自动加载图片
mWebSettings.setBlockNetworkImage(false);//解决图片不显示
//调用JS方法.安卓版本大于17,加上注解 @JavascriptInterface
mWebSettings.setJavaScriptEnabled(true);
mWebSettings.setSupportMultipleWindows(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mWebSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
//缓存数据
saveData(mWebSettings);
newWin(mWebSettings);
setWebChromeClient(new BaseWebChromeClient());
setWebViewClient(new BaseWebViewClient());
setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return true;
}
});
}
/**
* 多窗口的问题
*/
private void newWin(WebSettings mWebSettings) {
//html中的_bank标签就是新建窗口打开,有时会打不开,需要加以下
//然后 复写 WebChromeClient的onCreateWindow方法
mWebSettings.setSupportMultipleWindows(false);
mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);
}
/**
* HTML5数据存储
*/
private void saveData(WebSettings mWebSettings) {
//有时候网页需要自己保存一些关键数据,Android WebView 需要自己设置
if (NetStatusUtil.isConnected(mContext)) {
mWebSettings.setCacheMode(WebSettings.LOAD_DEFAULT);//根据cache-control决定是否从网络上取数据。
} else {
mWebSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//没网,则从本地获取,即离线加载
}
File cacheDir = mContext.getCacheDir();
if (cacheDir != null) {
String appCachePath = cacheDir.getAbsolutePath();
mWebSettings.setDomStorageEnabled(true);
mWebSettings.setDatabaseEnabled(true);
mWebSettings.setAppCacheEnabled(true);
mWebSettings.setAppCachePath(appCachePath);
}
}
/**
* 实现一个基础的 WebViewClient ,如果有更多的需要,直接继承它
*/
static class BaseWebViewClient extends WebViewClient {
/**
* 多页面在同一个WebView中打开,就是不新建activity或者调用系统浏览器打开
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
super.onReceivedSslError(view, handler, error);
handler.proceed();// 接受所有网站的证书
}
}
/**
* 实现一个基础的 WebChromeClient ,如果有更多的需要,直接继承它
*/
static class BaseWebChromeClient extends WebChromeClient {
//=========HTML5定位==========================================================
//需要先加入权限
//<uses-permission android:name="android.permission.INTERNET"/>
//<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
//<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
super.onReceivedIcon(view, icon);
}
@Override
public void onGeolocationPermissionsHidePrompt() {
super.onGeolocationPermissionsHidePrompt();
}
@Override
public void onGeolocationPermissionsShowPrompt(final String origin, final GeolocationPermissions.Callback
callback) {
callback.invoke(origin, true, false);//注意个函数,第二个参数就是是否同意定位权限,第三个是是否希望内核记住
super.onGeolocationPermissionsShowPrompt(origin, callback);
}
//=========HTML5定位==========================================================
//=========多窗口的问题==========================================================
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(view);
resultMsg.sendToTarget();
return true;
}
//=========多窗口的问题==========================================================
}
}
package com.warmlight.voicepacket.web;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.webkit.DownloadListener;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.warmlight.voicepacket.R;
import com.warmlight.voicepacket.base.BaseActivity;
import org.json.JSONArray;
import java.util.Hashtable;
public class WebViewActivity extends BaseActivity implements View.OnClickListener {
private String mUrl;
private String title;
private FrameLayout mLayout;
private ProgressBar mSeekBar;
private Html5WebView mWebView;
public static void loadUrl(Context context,String url,String title){
Intent intent = new Intent(context,WebViewActivity.class);
intent.putExtra("url",url);
intent.putExtra("title",title);
context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
setContentView(R.layout.activity_web);
getParameter();
mLayout = (FrameLayout) findViewById(R.id.web_layout);
mSeekBar = (ProgressBar) findViewById(R.id.web_sbr);
LinearLayout ll_back = (LinearLayout) findViewById(R.id.ll_back);
TextView tv_header_titlename = (TextView) findViewById(R.id.tv_header_titlename);
if (TextUtils.isEmpty(title)){
tv_header_titlename.setText("玩皮语音包");
}else {
tv_header_titlename.setText(title);
}
ll_back.setOnClickListener(this);
// 创建 WebView
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
mWebView = new Html5WebView(getApplicationContext());
mWebView.setLayoutParams(params);
mLayout.addView(mWebView);
mWebView.setWebChromeClient(new Html5WebChromeClient());
mWebView.setWebViewClient(new MyWebViewClient());
mWebView.loadUrl(mUrl);
mWebView.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
// 处理下载事件
Uri uri = Uri.parse(url); // url为你要链接的地址
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.ll_back:
if (mWebView != null && mWebView.canGoBack()) {
mWebView.goBack();
} else {
WebViewActivity.this.finish();
}
break;
}
}
class MyWebViewClient extends Html5WebView.BaseWebViewClient{
@Override
public void onPageStarted(WebView webView, String s, Bitmap bitmap) {
mSeekBar.setProgress(0);
mSeekBar.setVisibility(View.VISIBLE);
}
@Override
public void onPageFinished(WebView webView, String s) {
mSeekBar.setVisibility(View.INVISIBLE);
// writeData();
}
@Override
public void onReceivedError(WebView webView, int i, String s, String s1) {
}
/**
* 防止加载网页时调起系统浏览器
*/
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
// 继承 WebView 里面实现的基类
class Html5WebChromeClient extends Html5WebView.BaseWebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
// 顶部显示网页加载进度
mSeekBar.setProgress(newProgress);
if (newProgress == 100){
mSeekBar.setVisibility(View.GONE);
}
}
}
@Override
protected void onDestroy() {
// 销毁 WebView
if (mWebView != null) {
mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
mWebView.clearHistory();
((ViewGroup) mWebView.getParent()).removeView(mWebView);
mWebView.destroy();
mWebView = null;
}
super.onDestroy();
}
public void getParameter() {
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
mUrl = bundle.getString("url");
title = bundle.getString("title");
} else {
mUrl = "https://wing-li.github.io/";
title = "玩皮语音包";
}
// mUrl = "https://m.ajimiyou.com/tg/?from=test";
}
//============================= 下面是本 demo 的逻辑代码
// ======================================================================================
/**
* 按目录键,弹出“关闭页面”的选项
*/
// @Override
// public boolean onCreateOptionsMenu(Menu menu) {
// getMenuInflater().inflate(R.menu.menu, menu);
// return super.onCreateOptionsMenu(menu);
// }
//
// @Override
// public boolean onOptionsItemSelected(MenuItem item) {
//
// int itemId = item.getItemId();
// switch (itemId) {
// case R.id.close:
// WebViewActivity.this.finish();
// return true;
// case R.id.copy:
// ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
// String url = mWebView.getUrl();
// ClipData clipData = ClipData.newPlainText("test", url);
// if (clipboardManager != null) {
// clipboardManager.setPrimaryClip(clipData);
// Toast.makeText(getApplicationContext(), "本页网址复制成功", Toast.LENGTH_SHORT).show();
// }
// return true;
// }
// return super.onOptionsItemSelected(item);
// }
private long mOldTime;
/**
* 点击“返回键”,返回上一层
* 双击“返回键”,返回到最开始进来时的网页
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// if (System.currentTimeMillis() - mOldTime < 1500) {
// mWebView.clearHistory();
// mWebView.loadUrl(mUrl);
// } else
if (mWebView.canGoBack()) {
mWebView.goBack();
} else {
WebViewActivity.this.finish();
}
// mOldTime = System.currentTimeMillis();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:gravity="center"
android:layout_height="@dimen/dp45">
<LinearLayout
android:id="@+id/ll_back"
android:layout_width="wrap_content"
android:paddingLeft="@dimen/dp15"
android:gravity="center"
android:layout_height="match_parent">
<ImageView
android:layout_width="@dimen/dp14"
android:layout_height="@dimen/dp14"
android:src="@drawable/icon_back"/>
</LinearLayout>
<TextView
android:id="@+id/tv_header_titlename"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:text="哈哈"
android:gravity="center"
android:layout_weight="1"
android:textStyle="bold"
android:textColor="@color/color_333"
android:textSize="@dimen/dp14"/>
<LinearLayout
android:id="@+id/ll_header_right"
android:layout_width="wrap_content"
android:paddingRight="@dimen/dp15"
android:gravity="center"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_header_right"
android:layout_width="@dimen/dp14"
android:layout_height="@dimen/dp14"
android:visibility="gone"
android:src="@drawable/icon_back"/>
</LinearLayout>
</LinearLayout>
<ImageView
android:layout_width="match_parent"
android:layout_height="1dp"
android:src="#EEEEEE" />
<ProgressBar
android:id="@+id/web_sbr"
android:layout_width="match_parent"
android:layout_height="1dp"
android:progress="0"
android:max="100"
android:progressDrawable="@drawable/controller_progress"
android:visibility="invisible"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"/>
<FrameLayout
android:id="@+id/web_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@android:id/background">
<shape>
<solid android:color="#66ffffff" />
<stroke
android:width="0dp"
android:color="#66ffffff" />
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<solid android:color="@android:color/white" />
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<solid android:color="#ff6634" />
<stroke
android:width="0dp"
android:color="#ff6634" />
</shape>
</clip>
</item>
</layer-list>