package com.dyh.browser.activity; import android.content.ClipData; import android.content.ClipDescription; import android.content.ClipboardManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ActivityInfo; import android.graphics.Bitmap; import android.net.Uri; import android.net.http.SslError; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.provider.Settings; import android.support.design.widget.Snackbar; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.webkit.DownloadListener; import android.webkit.JsPromptResult; import android.webkit.JsResult; import android.webkit.SslErrorHandler; import android.webkit.WebChromeClient; import android.webkit.WebResourceRequest; import android.webkit.WebResourceResponse; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ProgressBar; import android.widget.TextView; import com.dyh.browser.plugin.HostManager; import com.dyh.browser.plugin.VipManager; import com.dyh.movienow.R; import com.dyh.movienow.base.BaseActivity; import com.dyh.movienow.bean.Video; import com.dyh.movienow.core.event.FindVideoEvent; import com.dyh.movienow.core.player.DetectorManager; import com.dyh.movienow.core.player.JieXiUtil; import com.dyh.movienow.core.player.PlayChooser; import com.dyh.movienow.ui.event.BackToChapterEvent; import com.dyh.movienow.ui.event.LoadNextMovieEvent; import com.dyh.movienow.ui.home.MainUtil; import com.dyh.movienow.ui.setting.entity.VideoInfo; import com.dyh.movienow.util.DebugUtil; import com.dyh.movienow.util.FileUtils; import com.dyh.movienow.util.HeavyTaskUtil; import com.dyh.movienow.util.Helper; import com.dyh.movienow.util.PreferenceMgr; import com.dyh.movienow.util.ShareUtil; import com.dyh.movienow.util.StringUtil; import com.dyh.movienow.util.ToastMgr; import com.dyh.movienow.view.CornerImageView; import com.dyh.movienow.view.PowerSingleLineMenu; import com.dyh.movienow.view.ScrollWebView; import com.maning.updatelibrary.InstallUtils; import com.skydoves.powermenu.MenuAnimation; import com.skydoves.powermenu.OnMenuItemClickListener; import com.skydoves.powermenu.PowerMenu; import com.skydoves.powermenu.PowerMenuItem; import com.trycatch.mysnackbar.Prompt; import com.trycatch.mysnackbar.TSnackbar; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import cn.refactor.lib.colordialog.PromptDialog; import ren.yale.android.cachewebviewlib.WebViewCacheInterceptorInst; import static android.view.View.GONE; import static android.view.View.VISIBLE; /** * 作者:By hdy * 日期:On 2018/3/13 * 时间:At 20:10 */ public class WebViewActivity extends BaseActivity implements View.OnClickListener { private ScrollWebView webViewT; private ProgressBar bar; private String movieFind; private String baseUrl; private String text = ""; private String webUrl; private PowerMenu powerMenu; private boolean isUsePlayer = false; private boolean hasDismissXiuTan = false; private String[] videoWebs; private boolean isOnPause; private PowerSingleLineMenu videoListMenu; //视频全屏参数 protected static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); private View customView; private FrameLayout fullscreenContainer; private WebChromeClient.CustomViewCallback customViewCallback; private String updateApkPath; private Map<String, String> jsStrs = new HashMap<>(); private ClipboardManager.OnPrimaryClipChangedListener hasPrimaryClip; private long previousTime = 0; private boolean isDebug = false; private Toolbar toolbar; private ViewGroup viewGroup;//注意getRootView()最为重要,直接关系到TSnackBar的位置 private TSnackbar tSnackbar; private boolean isXiuTan = false; private boolean blockImg; private boolean needCache = false; private TextView bottomTitleView; private View bottomBar; private boolean isXiuTanAutoPlayMode = true; private CornerImageView bottomBarXiuTan; private boolean isConfirm; private String movieTitle; private boolean hasAutoPlay = false; @Override protected void initLayout(Bundle savedInstanceState) { setContentView(R.layout.browser_ac_web); } @Override protected void initView() { try { toolbar = (Toolbar) findView(R.id.web3_toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } catch (Exception e) { e.printStackTrace(); } bar = findView(R.id.myProgressBar3); FrameLayout frameLayout = findView(R.id.web_container); webViewT = new ScrollWebView(getContext()); frameLayout.addView(webViewT, 0); webViewT.setFocusable(true); webViewT.setFocusableInTouchMode(true); String urls = ".iqiyi.com .youku.com .le.com .letv.com v.qq.com .tudou.com .mgtv.com film.sohu.com tv.sohu.com .acfun.cn .bilibili.com .pptv.com vip.1905.com .yinyuetai.com .fun.tv .56.com"; videoWebs = urls.split(" "); blockImg = false; bottomTitleView = findView(R.id.bottom_bar_title); bottomBar = findView(R.id.bottom_bar_bg); findView(R.id.bottom_bar_jie_xi).setOnClickListener(this); findView(R.id.bottom_bar_refresh).setOnClickListener(this); findView(R.id.bottom_bar_xiu_tan_bg).setOnClickListener(this); bottomBarXiuTan = findView(R.id.bottom_bar_xiu_tan); bottomBarXiuTan.setCornerText("0"); bottomTitleView.setText("loading"); bottomTitleView.setOnClickListener(this); movieTitle = getIntent().getStringExtra("title"); if (TextUtils.isEmpty(movieTitle)) { movieTitle = ""; } //初始化WebSettings initWebSettings(); //初始化WebView initWebView(); //初始化加载参数 startLoadUrl(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.bottom_bar_refresh: webViewT.reload(); break; case R.id.bottom_bar_title: Helper.copyToClipboard(getContext(), webViewT.getUrl()); ToastMgr.toastShortBottomCenter(getContext(), "已经复制链接到剪贴板"); break; case R.id.bottom_bar_jie_xi: try { tryJieXi(); } catch (Exception e) { e.printStackTrace(); jieXiUseDialog(); } break; case R.id.bottom_bar_xiu_tan_bg: if (!isUsePlayer) { showVideoList(); } else { ToastMgr.toastShortCenter(getContext(), "当前页面不支持此功能"); } break; } } @Override protected void processLogic(Bundle savedInstanceState) { if (!EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().register(this); } //初始化监听剪贴板 final ClipboardManager manager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); hasPrimaryClip = new ClipboardManager.OnPrimaryClipChangedListener() { @Override public void onPrimaryClipChanged() { long now = System.currentTimeMillis(); if (now - previousTime < 5000) { return; } previousTime = now; if (manager == null || !manager.hasPrimaryClip()) { return; } //如果是文本信息 if (manager.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN) || manager.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_HTML)) { ClipData cdText = manager.getPrimaryClip(); ClipData.Item item = cdText.getItemAt(0); //此处是TEXT文本信息 if (item.getText() != null) { final String t = item.getText().toString(); Snackbar.make(webViewT, "剪贴板被使用,是否撤销内容", Snackbar.LENGTH_LONG) .setAction("撤销", new View.OnClickListener() { @Override public void onClick(View view) { Helper.copyToClipboard(getContext(), text); } }).addCallback(new Snackbar.Callback() { @Override public void onDismissed(Snackbar transientBottomBar, int event) { text = t; super.onDismissed(transientBottomBar, event); } }).show(); } } } }; if (manager != null) { manager.addPrimaryClipChangedListener(hasPrimaryClip); } } @Override public void setTitle(CharSequence title) { super.setTitle(title); bottomTitleView.setText(webViewT.getUrl()); } @Override public void onPause() { try { if (webViewT != null) { webViewT.onPause(); } } catch (Exception e) { e.printStackTrace(); } isOnPause = true; super.onPause(); } @Override public void onResume() { text = Helper.getTextFromClipBoard(getContext()); try { if (isOnPause) { if (webViewT != null) { webViewT.onResume(); } } } catch (Exception e) { e.printStackTrace(); } isOnPause = false; super.onResume(); } @Override protected void onStart() { super.onStart(); } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { ClipboardManager manager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); if (manager != null) { manager.removePrimaryClipChangedListener(hasPrimaryClip); } try { releaseWebViews(); } catch (Exception e) { e.printStackTrace(); } EventBus.getDefault().unregister(this); super.onDestroy(); } @Subscribe(threadMode = ThreadMode.MAIN) public void backToChapter(BackToChapterEvent event) { if(isXiuTan) { ToastMgr.toastShortBottomCenter(getContext(), "正在自动帮您跳转"); tryBackToChapter(0, event.isLast()); } } private void tryBackToChapter(final int times, final boolean last) { if (times > 5) return; if (isOnPause) { new Handler().postDelayed(new Runnable() { @Override public void run() { tryBackToChapter(times + 1, last); } }, 500); } else { EventBus.getDefault().post(new LoadNextMovieEvent(last)); finish(); } } private synchronized void releaseWebViews() { if (webViewT != null) { try { if (webViewT.getParent() != null) { ((ViewGroup) webViewT.getParent()).removeView(webViewT); } webViewT.destroy(); } catch (IllegalArgumentException ignored) { } webViewT = null; } } @Override public void onBackPressed() { /** 回退键 事件处理 优先级:视频播放全屏-网页回退-关闭页面 */ if (customView != null) { hideCustomView(); } else if (webViewT.canGoBack()) webViewT.goBack(); else finish(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.web_right_top, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); break; case R.id.hide_bottom_bar: if (bottomBar.getVisibility() == GONE) { bottomBar.setVisibility(VISIBLE); bottomBar.animate().alpha(0).setDuration(300).start(); break; } bottomBar.setVisibility(GONE); bottomBar.animate().alpha(1).setDuration(300).start(); break; case R.id.menu_clear_all: webViewT.loadUrl("javascript:localStorage.clear()"); ToastMgr.toastShortBottomCenter(getContext(), "已清除完毕"); break; case R.id.menu_share: ShareUtil.findChooserToDeal(getContext(), webViewT.getUrl()); break; case R.id.menu_copy: Helper.copyToClipboard(getContext(), webViewT.getUrl()); ToastMgr.toastShortBottomCenter(getContext(), "已经复制链接到剪贴板"); break; case R.id.menu_debug: isDebug = true; webViewT.reload(); break; case R.id.fresh: webViewT.reload(); break; case R.id.menu_xiutan: if (!isUsePlayer) { showVideoList(); } else { ToastMgr.toastShortCenter(getContext(), "当前页面不支持此功能"); } break; case R.id.jiexi: try { tryJieXi(); } catch (Exception e) { e.printStackTrace(); jieXiUseDialog(); } break; } return super.onOptionsItemSelected(item); } private void jieXiUseDialog() { webUrl = webViewT.getUrl(); if (webUrl == null) { return; } if (!shouldLoadVIP(webUrl)) { ToastMgr.toastShortCenter(getContext(), "当前网站不可解析"); return; } List<PowerMenuItem> items = VipManager.getInstance().getItemList(); String[] name = new String[items.size()]; for (int i = 0; i < items.size(); i++) { name[i] = items.get(i).getTitle(); } new AlertDialog.Builder(this).setTitle("选择解析接口") .setSingleChoiceItems(name , 0, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if (webUrl.contains("youku.com") || webUrl.contains("v.qq.com")) { webUrl = webUrl.split(".html")[0] + ".html"; } String url = VipManager.getInstance().getUrlList().get(which); dialog.dismiss(); webViewT.loadUrl(url.replace("**", JieXiUtil.tryGetRealUrl(webUrl))); VipManager.getInstance().setSelect(which); } }).setNegativeButton("取消", null).show(); } private void tryJieXi() { webUrl = webViewT.getUrl(); if (webUrl == null) { return; } if (!shouldLoadVIP(webUrl)) { ToastMgr.toastShortCenter(getContext(), "当前网站不可解析"); return; } List<PowerMenuItem> items = VipManager.getInstance().getItemList(); powerMenu = new PowerMenu.Builder(getContext()) .addItem(new PowerMenuItem(items.size() == 0 ? "接口正在初始化,请重试" : "解析接口", false)) .addItemList(items) .setAnimation(MenuAnimation.DROP_DOWN) // Animation start point (TOP | LEFT) .setMenuRadius(10f) .setMenuShadow(10f) .setDivider(getResources().getDrawable(R.drawable.divider_power_menu)) .setDividerHeight(Helper.dpToPx(getContext(), 1)) .setSelectedTextColor(getContext().getResources().getColor(R.color.redColor)) .setSelectedMenuColor(getContext().getResources().getColor(R.color.white)) .setOnMenuItemClickListener(new OnMenuItemClickListener<PowerMenuItem>() { @Override public void onItemClick(int position, PowerMenuItem item) { position = position - 1; if (position < 0) { return; } if (webUrl.contains("youku.com") || webUrl.contains("v.qq.com")) { webUrl = webUrl.split(".html")[0] + ".html"; } String url = VipManager.getInstance().getUrlList().get(position); powerMenu.dismiss(); webViewT.loadUrl(url.replace("**", JieXiUtil.tryGetRealUrl(webUrl))); VipManager.getInstance().setSelect(position); } }).build(); powerMenu.showAsDropDown(toolbar, toolbar.getWidth(), 0); } private void loadDebugJs() { if (!isDebug) { return; } webViewT.evaluateJavascript(getJs("console.js"), null); } /** * 检测到视频 * * @param videoEvent 视频 */ @Subscribe(threadMode = ThreadMode.MAIN) public void onFindVideoEvent(FindVideoEvent videoEvent) { if (tSnackbar != null) { try { tSnackbar.dismiss(); } catch (Exception e) { e.printStackTrace(); } } if (bottomBar.getVisibility() == GONE) { bottomBar.setVisibility(VISIBLE); bottomBar.animate().alpha(1).setDuration(300).start(); } bottomBarXiuTan.setCornerText(videoEvent.getTitle()); if (isXiuTanAutoPlayMode) { String dom = StringUtil.getDom(webViewT.getUrl()); String url = StringUtil.getDom(videoEvent.getUrl()); if (DetectorManager.getInstance().inXiuTanLiked(getContext(), dom, url)) { int code = getIntent().getIntExtra("uWho", 0); if (TextUtils.isEmpty(movieTitle)) movieTitle = webViewT.getTitle(); if (code == 0 && !isOnPause && !hasAutoPlay) { hasAutoPlay = true; ToastMgr.toastShortBottomCenter(getContext(), "已自动播放常用的嗅探地址"); PlayChooser.startPlayer(getContext(), movieTitle, videoEvent.getUrl()); } else if (code == 304 && !isOnPause && !hasAutoPlay) { hasAutoPlay = true; ToastMgr.toastShortBottomCenter(getContext(), "已自动播放常用的嗅探地址"); Intent intent = new Intent(); intent.putExtra("videourl", videoEvent.getUrl()); intent.putExtra("title", movieTitle); setResult(code, intent); finish(); } } } if (!hasDismissXiuTan) { hasDismissXiuTan = true; if (!hasAutoPlay) { new PromptDialog(this) .setDialogType(PromptDialog.DIALOG_TYPE_SUCCESS) .setAnimationEnable(true) .setTitleText("方圆嗅探") .setContentText("网页中检测到" + videoEvent.getTitle() + "条视频链接,点击查看按钮查看或者播放视频链接") .setPositiveListener("查看视频", new PromptDialog.OnPositiveListener() { @Override public void onClick(PromptDialog dialog) { dialog.dismiss(); showVideoList(); } }).show(); } } } private void startLoadUrl() { movieFind = getIntent().getStringExtra("movieFind"); baseUrl = getIntent().getStringExtra("baseUrl"); isUsePlayer = getIntent().getBooleanExtra("isUsePlayer", false); isXiuTanAutoPlayMode = (boolean) PreferenceMgr.get(getContext(), "xiuTanAutoPlayMode", true); if (isUsePlayer) { String text = FileUtils.getAssetsString("DPlayer.html", getContext()); String url = getIntent().getStringExtra("url"); text = text.replace("fy_player_url", url); FileUtils.write(getContext(), "video.html", text); String path = "file://" + FileUtils.getFilePath(getContext(), "video.html"); webViewT.loadUrl(path); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } else { isXiuTan = getIntent().getBooleanExtra("is_xiu_tan", false); if (isXiuTan) { needCache = true; showXiuTanMessage(); } else { needCache = false; } String loadUrl = getIntent().getStringExtra("url"); webViewT.loadUrl(loadUrl); } if (!isUsePlayer) { DetectorManager.getInstance().createThread(); } } private void showXiuTanMessage() { boolean blockImgForXiuTan = (boolean) PreferenceMgr.get(getContext(), "blockImgForXiuTan", true); if (blockImgForXiuTan) { blockImg = true; } if (viewGroup == null) { try { viewGroup = (ViewGroup) findViewById(android.R.id.content).getRootView(); } catch (Exception e) { e.printStackTrace(); } } if (viewGroup == null) { return; } if (tSnackbar == null) { tSnackbar = TSnackbar.make(viewGroup, "正在嗅探中...请稍候", TSnackbar.LENGTH_INDEFINITE, TSnackbar.APPEAR_FROM_TOP_TO_DOWN); tSnackbar.setPromptThemBackground(Prompt.SUCCESS); tSnackbar.addIconProgressLoading(0, true, false); tSnackbar.setAction("取消", new View.OnClickListener() { @Override public void onClick(View v) { tSnackbar.dismiss(); } }); } tSnackbar.show(); } private void initWebView() { webViewT.setDownloadListener(new DownloadListener() { @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { final String surl = url; DetectorManager.getInstance().addTask(new Video(url, url)); Snackbar.make(webViewT, "是否允许网页中的下载请求?", Snackbar.LENGTH_LONG) .setAction("允许", new View.OnClickListener() { @Override public void onClick(View v) { if (surl.contains(".apk")) { MainUtil.DownLoadApk(getContext(), surl, new MainUtil.OkListener() { @Override public void onClickOk(String arg) { updateApkPath = arg; install(); } }); } else { ShareUtil.findChooserToDeal(getContext(), surl); } } }).show(); } }); webViewT.setWebChromeClient(mWebChromeClient); webViewT.setWebViewClient(webViewClient); // webViewT.addJavascriptInterface(new VideoInterface(), "fy_bridge_app"); webViewT.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { final WebView.HitTestResult result = webViewT.getHitTestResult(); int type = result.getType(); if (type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { Snackbar.make(view, "是否隐藏该图片?", Snackbar.LENGTH_LONG) .setAction("隐藏", new View.OnClickListener() { @Override public void onClick(View view) { String js = "(function(){ var videoElements = document.getElementsByTagName(\"img\");for(var i = 0;i < videoElements.length; i++) {var videoSrc = videoElements[i].src;if(videoSrc==\"" + result.getExtra() + "\"){videoElements[i].style.display=\"none\";break;};};})();"; webViewT.evaluateJavascript(js, null); } }).show(); } return false; } }); webViewT.setOnScrollChangeListener(new ScrollWebView.OnScrollChangeListener() { @Override public void onPageEnd(int l, int t, int oldl, int oldt) { } @Override public void onPageTop(int l, int t, int oldl, int oldt) { } @Override public void onScrollChanged(int l, int t, int dx_change, int dy_change) { // webview的高度 if (dy_change > 50) { //上滑隐藏 if (bottomBar.getVisibility() == VISIBLE) { bottomBar.setVisibility(GONE); bottomBar.animate().alpha(0).setDuration(300).start(); } } else if (dy_change < -50) { //下滑显示 if (bottomBar.getVisibility() == GONE) { bottomBar.setVisibility(VISIBLE); bottomBar.animate().alpha(1).setDuration(300).start(); } } } }); if (getIntent().getIntExtra("uWho", 0) == 304) { webViewT.clearCache(false); } } private void initWebSettings() { WebSettings webSettings = webViewT.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setBuiltInZoomControls(true); webSettings.setSupportZoom(true); webSettings.setDisplayZoomControls(false); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webSettings.setAllowFileAccess(true); webSettings.setDefaultTextEncodingName("UTF-8"); webSettings.setLoadWithOverviewMode(true); webSettings.setUseWideViewPort(true); webSettings.setDomStorageEnabled(true); webSettings.setAppCacheMaxSize(1024 * 1024 * 8); String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath(); webSettings.setAppCachePath(appCachePath); webSettings.setAllowFileAccess(true); webSettings.setAppCacheEnabled(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int mDensity = metrics.densityDpi; if (mDensity == 240) { webSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR); } else if (mDensity == 160) { webSettings.setDefaultZoom(WebSettings.ZoomDensity.MEDIUM); } else if (mDensity == 120) { webSettings.setDefaultZoom(WebSettings.ZoomDensity.CLOSE); } else if (mDensity == DisplayMetrics.DENSITY_XHIGH) { webSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR); } else if (mDensity == DisplayMetrics.DENSITY_TV) { webSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR); } else { webSettings.setDefaultZoom(WebSettings.ZoomDensity.MEDIUM); } } private WebChromeClient mWebChromeClient = new WebChromeClient() { @Override public void onReceivedTitle(WebView webView, String s) { super.onReceivedTitle(webView, s); if (!getIntent().getStringExtra("url").equals(webView.getUrl())) { movieTitle = movieTitle + "_" + s; } else if (TextUtils.isEmpty(movieTitle)) { movieTitle = s; } setTitle(s); } @Override public void onProgressChanged(WebView webView, int i) { super.onProgressChanged(webView, i); if (i == 100) { bar.setVisibility(View.INVISIBLE); } else { if (bar.getVisibility() == View.INVISIBLE) { bar.setVisibility(VISIBLE); } bar.setProgress(i); } if (tSnackbar != null) { tSnackbar.setText("正在嗅探中" + i + "%...请稍候"); } } /*** 视频播放相关的方法 **/ @Override public View getVideoLoadingProgressView() { FrameLayout frameLayout = new FrameLayout(getContext()); frameLayout.setLayoutParams(new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.MATCH_PARENT)); return frameLayout; } @Override public void onShowCustomView(View view, CustomViewCallback callback) { showCustomView(view, callback); } @Override public void onHideCustomView() { hideCustomView(); } @Override public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { Snackbar.make(view, message, Snackbar.LENGTH_LONG) .setAction("确定", new View.OnClickListener() { @Override public void onClick(View v) { result.confirm(); } }).show(); return true; } @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { isConfirm = false; Snackbar.make(view, message, Snackbar.LENGTH_LONG) .setAction("确定", new View.OnClickListener() { @Override public void onClick(View v) { isConfirm = true; result.confirm(); } }).addCallback(new Snackbar.Callback() { @Override public void onDismissed(Snackbar transientBottomBar, int event) { if (!isConfirm) { result.cancel(); } super.onDismissed(transientBottomBar, event); } }).show(); return true; } @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) { View view1 = LayoutInflater.from(getContext()).inflate(R.layout.view_dialog_web_add, null, false); final EditText titleE = view1.findViewById(R.id.web_add_title); EditText urlE = view1.findViewById(R.id.web_add_url); titleE.setHint("message"); urlE.setHint("请在这里输入"); titleE.setText(message); urlE.setText(defaultValue); new AlertDialog.Builder(getContext()).setTitle("来自网页的输入请求").setView(view1) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String value = titleE.getText().toString(); result.confirm(value); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.cancel(); } }).show(); return true; } }; private WebViewClient webViewClient = new WebViewClient() { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { Snackbar.make(webViewT, "证书校验失败,是否回撤网页?", Snackbar.LENGTH_LONG) .setAction("回撤", new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }).show(); handler.proceed(); } @Override public void onPageStarted(WebView webView, String s, Bitmap bitmap) { super.onPageStarted(webView, s, bitmap); if (bottomBar.getVisibility() == GONE) { bottomBar.setVisibility(VISIBLE); bottomBar.animate().alpha(1).setDuration(300).start(); } bottomBarXiuTan.setCornerText("0"); hasAutoPlay = false; webViewT.getSettings().setBlockNetworkImage(true); hasDismissXiuTan = false; if (!isUsePlayer) { DetectorManager.getInstance().startDetect(); } } @Override public void onPageFinished(WebView webView, String s) { if (!blockImg) { webViewT.getSettings().setBlockNetworkImage(false); } // else { // //下一次就不再拦截,比如刷新了网页 // blockImg = false; // } if (baseUrl != null && !baseUrl.equals("") && s.contains(baseUrl)) { String js = "(function() {" + movieFind + "})();"; webViewT.evaluateJavascript(js, null); } try { loadMyJs(s); } catch (Exception e) { e.printStackTrace(); } loadDebugJs(); if (!isXiuTan) { HeavyTaskUtil.saveHistory(getContext(), "网页浏览", s, webView.getTitle()); } super.onPageFinished(webView, s); } @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { String url = request.getUrl().toString(); if (HostManager.getInstance().shouldIntercept(url)) { return new WebResourceResponse(null, null, null); } else { if (!isUsePlayer) { DetectorManager.getInstance().addTask(new Video(url, url)); } if (needCache) { return WebViewCacheInterceptorInst.getInstance().interceptRequest(request); } else { return super.shouldInterceptRequest(view, request); } } } if (needCache) { return WebViewCacheInterceptorInst.getInstance().interceptRequest(request); } else { return super.shouldInterceptRequest(view, request); } } @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) { if (HostManager.getInstance().shouldIntercept(url)) { return new WebResourceResponse(null, null, null); } else { if (!isUsePlayer) { DetectorManager.getInstance().addTask(new Video(url, url)); } } } if (needCache) { return WebViewCacheInterceptorInst.getInstance().interceptRequest(url); } else { return super.shouldInterceptRequest(view, url); } } @Override public boolean shouldOverrideUrlLoading(WebView view, final String url) { if (url.startsWith("http")) { return super.shouldOverrideUrlLoading(view, url); } else { Snackbar.make(webViewT, "是否允许网页打开外部应用?", Snackbar.LENGTH_LONG) .setAction("允许", new View.OnClickListener() { @Override public void onClick(View v) { ShareUtil.findChooserToDeal(getContext(), url); } }).show(); return true; } } }; /** * 视频播放全屏 函数集合 **/ private void showCustomView(View view, WebChromeClient.CustomViewCallback callback) { // if a view already exists then immediately terminate the new one if (customView != null) { callback.onCustomViewHidden(); return; } getWindow().getDecorView(); FrameLayout decor = (FrameLayout) getWindow().getDecorView(); fullscreenContainer = new FullscreenHolder(getContext()); fullscreenContainer.addView(view, COVER_SCREEN_PARAMS); decor.addView(fullscreenContainer, COVER_SCREEN_PARAMS); customView = view; customViewCallback = callback; webViewT.setVisibility(View.INVISIBLE); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setStatusBarVisibility(false); } /** * 隐藏视频全屏 */ private void hideCustomView() { if (customView == null) { return; } setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setStatusBarVisibility(true); FrameLayout decor = (FrameLayout) getWindow().getDecorView(); decor.removeView(fullscreenContainer); fullscreenContainer = null; customView = null; customViewCallback.onCustomViewHidden(); webViewT.setVisibility(VISIBLE); } /** * 全屏容器界面 */ static class FullscreenHolder extends FrameLayout { public FullscreenHolder(Context ctx) { super(ctx); setBackgroundColor(ctx.getResources().getColor(android.R.color.black)); } @Override public boolean onTouchEvent(MotionEvent evt) { return true; } } private void setStatusBarVisibility(boolean visible) { int flag = visible ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN; getWindow().setFlags(flag, WindowManager.LayoutParams.FLAG_FULLSCREEN); } public boolean shouldLoadVIP(String url) { String urls = "iqiyi.com youku.com le.com letv.com v.qq.com tudou.com mgtv.com film.sohu.com tv.sohu.com acfun.cn bilibili.com pptv.com vip.1905.com yinyuetai.com fun.tv 56.com"; String[] u = urls.split(" "); for (int i = 0; i < u.length; i++) { if (url.contains(u[i])) { return true; } } return false; } private void showVideoList() { List<PowerMenuItem> items = new ArrayList<>(); final List<VideoInfo> videoInfos = new ArrayList<>(DetectorManager.getInstance().getVideoList()); if (videoInfos.size() < 1) { ToastMgr.toastShortCenter(getContext(), "还没有嗅探到视频,请稍候重试"); return; } for (int i = 0; i < videoInfos.size(); i++) { String detectImageType = videoInfos.get(i).getDetectImageType(); String title; if (TextUtils.isEmpty(detectImageType)) { title = "视频" + (i + 1) + ":" + videoInfos.get(i).getSourcePageTitle(); } else { title = "[" + detectImageType + "]视频" + (i + 1) + ":" + videoInfos.get(i).getSourcePageTitle(); } PowerMenuItem item = new PowerMenuItem(title, false); items.add(item); } DisplayMetrics dm = getResources().getDisplayMetrics(); videoListMenu = new PowerSingleLineMenu.Builder(getContext()) .addItem(new PowerMenuItem("嗅探到的视频,点击播放", false)) .addItemList(items) .setAnimation(MenuAnimation.SHOW_UP_CENTER) // Animation start point (TOP | LEFT) .setMenuRadius(10f).setMenuShadow(10f) .setDivider(getResources().getDrawable(R.drawable.divider_power_menu)) .setWith((int) ((float) dm.widthPixels * 0.8)) .setSelectedTextColor(getContext().getResources().getColor(R.color.redColor)) .setSelectedMenuColor(getContext().getResources().getColor(R.color.white)) .setOnMenuItemClickListener(new OnMenuItemClickListener<PowerMenuItem>() { @Override public void onItemClick(int position, PowerMenuItem item) { try { videoListMenu.dismiss(); } catch (Exception e) { e.printStackTrace(); } try { if (position == 0) return; int code = getIntent().getIntExtra("uWho", 0); VideoInfo videoInfo = videoInfos.get(position - 1); String dom = StringUtil.getDom(webViewT.getUrl()); String url = StringUtil.getDom(videoInfo.getSourcePageUrl()); DetectorManager.getInstance().putIntoXiuTanLiked(getContext(), dom, url); if (TextUtils.isEmpty(movieTitle)) movieTitle = webViewT.getTitle(); if (code == 0) { PlayChooser.startPlayer(getContext(), movieTitle, videoInfo.getSourcePageUrl()); } else if (code == 304) { Intent intent = new Intent(); intent.putExtra("videourl", videoInfo.getSourcePageUrl()); intent.putExtra("title", movieTitle); setResult(code, intent); finish(); } } catch (Exception e) { DebugUtil.showErrorMsg(webViewT, getContext(), e.getMessage() + "\n可能是第三方播放器调用失败,常见问题里面有下载地址"); } } }).build(); videoListMenu.showAtCenter(webViewT); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1000 && updateApkPath != null) {//获得安装应用程序的权限 install(); } super.onActivityResult(requestCode, resultCode, data); } private void install() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { boolean haveInstallPermission = getContext().getPackageManager().canRequestPackageInstalls(); if (!haveInstallPermission) { //跳转设置开启允许安装 //先获取是否有安装未知来源应用的权限 new PromptDialog(this) .setDialogType(PromptDialog.DIALOG_TYPE_WARNING) .setAnimationEnable(true) .setTitleText("温馨提示") .setContentText("尊敬的用户你好,必须开启安装软件的权限,才能完成新版本的成功安装") .setPositiveListener("好的", new PromptDialog.OnPositiveListener() { @Override public void onClick(PromptDialog dialog) { dialog.dismiss(); Uri packageURI = Uri.parse("package:" + getContext().getPackageName()); Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI); intent.putExtra("NewAppPath", updateApkPath); startActivityForResult(intent, 1000); } }).show(); return; } } InstallUtils.installAPK(WebViewActivity.this, updateApkPath, new InstallUtils.InstallCallBack() { @Override public void onSuccess() { ToastMgr.toastShortBottomCenter(getContext(), "正在安装程序"); } @Override public void onFail(Exception e) { ToastMgr.toastShortCenter(getContext(), "安装失败:" + e.toString()); } }); } private void loadMyJs(String url) { if (url.contains("m.icantv.cn/chan")) { webViewT.evaluateJavascript(getJs("icantv.js"), null); } else { for (String videoWeb : videoWebs) { if (url.contains(videoWeb)) { String jjjs = getJs("vipLoad.js"); if (!TextUtils.isEmpty(jjjs)) { webViewT.evaluateJavascript(jjjs, null); } break; } } } if (url.contains("youku.com")) { webViewT.evaluateJavascript(getJs("youkuApp.js"), null); } else if (url.contains("mgtv.com")) { webViewT.evaluateJavascript(getJs("mgtvApp.js"), null); } } private String getJs(String name) { if (!jsStrs.containsKey(name)) { if ("vipLoad.js".equals(name)) { String jss = FileUtils.getAssetsString(name, getContext()); List<PowerMenuItem> list = VipManager.getInstance().getItemList(); if (list.size() < 1) { return null; } List<String> urls = VipManager.getInstance().getUrlList(); StringBuilder builder = new StringBuilder("{name:ye+\""); for (int i = 0; i < list.size() - 1; i++) { String u = urls.get(i); builder.append(list.get(i).getTitle()).append("\",url:\"").append(u.replace("**", "")) .append("\",title:\"").append(list.get(i).getTitle()).append("\"},{name:ye+\""); } String u2 = urls.get(list.size() - 1); builder.append(list.get(list.size() - 1).getTitle()).append("\",url:\"").append(u2.replace("**", "")) .append("\",title:\"").append(list.get(list.size() - 1).getTitle()).append("\"}"); jss = jss.replace("***", builder.toString()); jsStrs.put(name, jss); } else { jsStrs.put(name, FileUtils.getAssetsString(name, getContext())); } } return jsStrs.get(name); } }