package cchen.z.interview.A.webview; import android.app.Activity; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Message; import android.support.v4.content.LocalBroadcastManager; import android.support.v4.widget.SwipeRefreshLayout; import android.text.ClipboardManager; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; import android.webkit.DownloadListener; import android.webkit.GeolocationPermissions; import android.webkit.JavascriptInterface; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.FrameLayout; import android.widget.PopupWindow; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.io.IOException; import java.net.URLEncoder; import java.util.HashMap; import cchen.z.interview.A.utils.StringUtil; import cchen.z.interview.A.utils.Utils; import cchen.z.interview.R; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class WebViewActivity extends Activity implements View.OnClickListener { public static final String TAG = WebViewActivity.class.getSimpleName(); public static final String EXTRA_URL = "URL"; public static final String EXTRA_TITLE = "title"; public static final String EXTRA_RIGHT_ICON = "rightIcon"; public static final String RIGHT_SHARE_BUTTON_DISPLAY = "right_share_btn_display"; public static final String EXTRA_SHARE_URL = "extra_share_url"; public static final String SCREEN_ORIENTATION_MODE = "screen_orientation_mode"; public static final int SCREEN_ORIENTATION_PORTRAIT = 0;//竖屏 public static final int SCREEN_ORIENTATION_LANDSCAPE = 1;//横屏 public static final int SCREEN_ORIENTATION_SENSOR = 3;//根据手机方向判断 private ProgressBar mHorizontalProgress;//顶部进度条 private WebView mWebView; private boolean mIsRightShareBtnDisplay = false; private ViewGroup mToolbar; private String url; private String title; boolean rightIcon = true; private int source = 0; public static final String SOURCE_FROM = "SOURCE"; public static final int FROM_CSL = 0x2; private String sso_tk; private HashMap<String, String> headers; private FrameLayout customViewContainer; private View mCustomView; private WebChromeClient.CustomViewCallback customViewCallback; private MyWebChromeClient myWebChromeClient; private SwipeRefreshLayout layout_swipe_refresh;//下拉刷新 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view); customViewContainer = (FrameLayout) findViewById(R.id.customViewContainer); headers = new HashMap<>(); if (getIntent() != null) { source = getIntent().getIntExtra(SOURCE_FROM, 0); title = getIntent().getStringExtra(EXTRA_TITLE); setOrientation(); //拼接参数 final String token1 = FakeUserCenter.getSSO_TOKEN(); sso_tk = token1; switch (source) { case FROM_CSL: url = "http://sso.xxxx/user/setUserStatus?from=mobile&next_action=" + URLEncoder.encode("http://next.html"); headers.put("SSOTK", token1); break; case 0: url = getIntent().getStringExtra(EXTRA_URL); if (url != null) { Uri uri = Uri.parse(url); Uri.Builder builder = Uri.parse(url).buildUpon(); if (uri.getScheme() == null) { builder.scheme("http"); url = builder.build().toString(); } Uri baseUri = Uri.parse(url); if (baseUri.getScheme() == null) { url = baseUri.buildUpon().scheme("http").build().toString(); } } mIsRightShareBtnDisplay = getIntent().getBooleanExtra(RIGHT_SHARE_BUTTON_DISPLAY, true); } rightIcon = getIntent().getBooleanExtra(EXTRA_RIGHT_ICON, true); initToolbar(); } mHorizontalProgress = (ProgressBar) findViewById(R.id.progress_horizontal); //有的url需要已登录用户的token if (url.contains("some_url_need_login")) { if (FakeUserCenter.isLogin()) { url = url + "&caller=1003&ssoTk=" + FakeUserCenter.getSSO_TOKEN(); } else { url = ""; TextView login = (TextView) findViewById(R.id.login); login.setVisibility(View.VISIBLE); login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(WebViewActivity.this, "login for user`s info", Toast.LENGTH_LONG).show(); // LoginService.addLetvLoginLayout(this, new LoginService.LetvLoginCallBack() { // @Override // public void success() { // login.setVisibility(View.GONE); // url = defultUrl + "&caller=1003&ssoTk=" + FakeUserCenter.getSSO_TOKEN(); // refresh(); // } // }); } }); } } initWebView(); layout_swipe_refresh = (SwipeRefreshLayout) findViewById(R.id.layout_swipe_refresh); layout_swipe_refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { refresh(); } }); refresh(); //注册登录广播接收器用于回调h5传token id IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(FakeUserCenter.LOGIN_STATUS_CHANGE_ACTION); mLoginReceiver = new LoginReceiver(); LocalBroadcastManager.getInstance(this).registerReceiver(mLoginReceiver, intentFilter); // LocalBroadcastManager只收发本APP的广播,不用担心数据泄露或者别人伪造广播。效率更高 } private void initWebView() { mWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = mWebView.getSettings(); //设置UA String userAgent = webSettings.getUserAgentString(); webSettings.setUserAgentString(userAgent + getApplication().getApplicationInfo().name + Utils.getAppVersionName(this)); // 设置支持JavaScript webSettings.setJavaScriptEnabled(true); //5.0以上支持http和https混合 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } //网页有缩放的需求才会体现出此特性,比如访问的是电脑版网页 webSettings.setSupportZoom(true); //显示原生缩放控制 webSettings.setDisplayZoomControls(true); webSettings.setBuiltInZoomControls(true); // webSettings.setDatabaseEnabled(true); // String dir = this.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath(); //是否支持地理位置 webSettings.setGeolocationEnabled(true); // webSettings.setGeolocationDatabasePath(dir); //将图片调整到适合webview的大小 webSettings.setUseWideViewPort(true); // 缩放至屏幕的大小 webSettings.setLoadWithOverviewMode(true); //默认也都是开 webSettings.setAllowFileAccess(true);//是否可以访问文件协议开头的资源 webSettings.setAllowContentAccess(true);//是否可以访问contentProvider协议的资源 //数据缓存分为两种:AppCache和DOM Storage(Web Storage)。 //dom storage 可以持久化存储,类似sharePreference //如果网页端需要存储一些简单的用key/value对即可解决的数据,DOM Storage是非常完美的方案。 webSettings.setDomStorageEnabled(true); // webSettings.setDatabasePath();已无效 //网页端的缓存。无关domStorage。 webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); webSettings.setAppCacheEnabled(false); if (Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) { String cacheFolder = "/sdcard" // Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "ez_webview_cache"; File cacheFolderFile = new File(cacheFolder); if (!cacheFolderFile.exists()) { boolean mkdirs = cacheFolderFile.mkdirs(); } webSettings.setAppCachePath(cacheFolder); //cache存放在data/data/包名/ } webSettings.setAppCacheMaxSize(Long.MAX_VALUE);//Android已改为自动管理 // LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据, // LOAD_DEFAULT:根据cache-control决定是否从网络上取数据。HTTP 协议头里的 Cache-Control, // LOAD_CACHE_NORMAL:API level 17中已经废弃, 从API level 11开始作用同- - LOAD_DEFAULT模式, // LOAD_NO_CACHE: 不使用缓存,只从网络获取数据, // LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。 // http协议缓存机制是指通过 HTTP 协议头里的 Cache-Control(或 Expires)和 Last-Modified(或 Etag)等字段来控制文件缓存的机制。 // Cache-Control 用于控制文件在本地缓存有效时长。最常见的,比如服务器回包:Cache-Control:max-age=600 表示文件在本地应该缓存,且有效时长是600秒(从发出请求算起)。在接下来600秒内,如果有请求这个资源,浏览器不会发出 HTTP 请求,而是直接使用本地缓存的文件。 // Last-Modified 是标识文件在服务器上的最新更新时间。下次请求时,如果文件缓存过期,浏览器通过 If-Modified-Since 字段带上这个时间,发送给服务器,由服务器比较时间戳来判断文件是否有修改。如果没有修改,服务器返回304告诉浏览器继续使用缓存;如果有修改,则返回200,同时返回最新的文件。 // Cache-Control 通常与 Last-Modified 一起使用。一个用于控制缓存有效时间,一个在缓存失效后,向服务查询是否有更新。 // Cache-Control 还有一个同功能的字段:Expires。Expires 的值一个绝对的时间点,如:Expires: Thu, 10 Nov 2015 08:45:11 GMT,表示在这个时间点之前,缓存都是有效的。 // Expires 是 HTTP1.0 标准中的字段,Cache-Control 是 HTTP1.1 标准中新加的字段,功能一样,都是控制缓存的有效时间。当这两个字段同时出现时,Cache-Control 是高优化级的。 // Etag 也是和 Last-Modified 一样,对文件进行标识的字段。不同的是,Etag 的取值是一个对文件进行标识的特征字串。 // 在向服务器查询文件是否有更新时,浏览器通过 If-None-Match 字段把特征字串发送给服务器,由服务器和文件最新特征字串进行匹配,来判断文件是否有更新。 // 没有更新回包304,有更新回包200。 // Etag 和 Last-Modified 可根据需求使用一个或两个同时使用。两个同时使用时,只要满足基中一个条件,就认为文件没有更新。 //允许跨域访问 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) webSettings.setAllowUniversalAccessFromFileURLs(true); //5.0以上打开webView跨域携带cookie的许可 if (Build.VERSION.SDK_INT >= 21) { CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptThirdPartyCookies(mWebView, true); } mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); /* if (Build.VERSION.SDK_INT < 19) { mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); }*/ //处理webView的回调 mWebView.setWebViewClient(webViewClient); //处理js回调 mWebView.setWebChromeClient(myWebChromeClient = new MyWebChromeClient()); mWebView.setDownloadListener(new DownloadListener() { @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } }); //为webView隐藏的接口,可能被远程控制。 mWebView.removeJavascriptInterface("searchBoxJavaBridge_"); mWebView.removeJavascriptInterface("accessibility"); mWebView.removeJavascriptInterface("accessibilityTraversal"); mWebView.addJavascriptInterface(jsInterface, "myJsInterface"); //长按打开图片 mWebView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { WebView.HitTestResult result = ((WebView) v).getHitTestResult(); int type = result.getType(); String extra = result.getExtra(); Log.d(TAG, type + " onLongClick " + extra); if (type == WebView.HitTestResult.UNKNOWN_TYPE) return false; switch (type) { case WebView.HitTestResult.PHONE_TYPE: break; case WebView.HitTestResult.EMAIL_TYPE: break; case WebView.HitTestResult.GEO_TYPE: break; case WebView.HitTestResult.SRC_ANCHOR_TYPE: break; case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE: break; case WebView.HitTestResult.IMAGE_TYPE: String saveImgUrl = result.getExtra(); Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(saveImgUrl)); startActivity(i); break; default: break; } return true; } }); } private void setOrientation() { int screen_mode = getIntent().getIntExtra(SCREEN_ORIENTATION_MODE, -1); if (screen_mode == SCREEN_ORIENTATION_PORTRAIT) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } else if (screen_mode == SCREEN_ORIENTATION_LANDSCAPE) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } else if (screen_mode == SCREEN_ORIENTATION_SENSOR) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); } } private void refresh() { layout_swipe_refresh.setRefreshing(false); if (getIntent() != null) { switch (source) { case FROM_CSL: /* Log.e("---url", url); mWebView.loadUrl(url, headers);*/ CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setCookie(url, "sso_tk=" + sso_tk); mWebView.loadUrl(url, headers); break; case 0: default: if (FakeUserCenter.isLogin()) { // SynLeSsoTk.setCookie(this, url, SynLeSsoTk.getInstances().getCookie(FakeUserCenter.getId(), WebViewActivity.this)); } mWebView.loadUrl(url); break; } } } WebViewClient webViewClient = new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (FakeUserCenter.isLogin()) { // SynLeSsoTk.setCookie(WebViewActivity.this, url, SynLeSsoTk.getInstances().getCookie(FakeUserCenter.getId(), WebViewActivity.this)); } CookieSyncManager.createInstance(WebViewActivity.this); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setCookie(url, "sso_tk=" + sso_tk); CookieSyncManager.getInstance().sync(); Uri uri = Uri.parse(url); if (url.startsWith("tel:") || url.startsWith("mailto:") || url.startsWith("weixin:")) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); return true; } else if (uri.getScheme().equals("qq.launch") && uri.getHost().equals("www.qq.com")) { if ("h5".equals(uri.getQueryParameter("from"))) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); return true; } else { url = uri.getQueryParameter("url"); WebViewActivity.this.url = url; mWebView.loadUrl(url); return true; } } else if (uri.getScheme().equals("qq.client")) { return true; } else { //view.loadUrl(url); WebViewActivity.this.url = url; return super.shouldOverrideUrlLoading(view, url); } } @Override public void onFormResubmission(WebView view, Message dontResend, Message resend) { resend.sendToTarget(); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { view.loadUrl("www.baidu.com"); Toast.makeText(view.getContext(), "net_error", Toast.LENGTH_SHORT).show(); } }; @Override public void onClick(View v) { switch (v.getId()) { case R.id.share: shareUrl(); popWindow.dismiss(); break; case R.id.copy: if (StringUtil.isEmpty(url)) break; ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); if (clipboard == null) break; clipboard.setText(url); if (clipboard.getText().equals(url)) Toast.makeText(this, "url_has_been_copied", Toast.LENGTH_LONG).show(); popWindow.dismiss(); break; case R.id.open_in_explore: if (StringUtil.isEmpty(url)) break; Uri uri = Uri.parse(url); // uri = uri.buildUpon().scheme("http").build(); Intent intent = new Intent(Intent.ACTION_VIEW, uri); try { startActivity(intent); } catch (Exception e) { e.printStackTrace(); } popWindow.dismiss(); break; case R.id.refresh: refresh(); popWindow.dismiss(); break; case android.R.id.home: finish(); break; } } private void shareUrl() { Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, url); sendIntent.putExtra(Intent.EXTRA_SUBJECT, title); sendIntent.setType("text/plain"); startActivity(sendIntent); } private class MyWebChromeClient extends WebChromeClient { private View mVideoProgressView; @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress >= 100) { if (mHorizontalProgress != null) { mHorizontalProgress.setVisibility(View.GONE); } } else { if (mHorizontalProgress != null && newProgress >= 0) { mHorizontalProgress.setVisibility(View.VISIBLE); mHorizontalProgress.setProgress(newProgress); } } } //当网页弹出alert @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Log.d(TAG, message); // This shows the dialog box. This can be commented out for dev AlertDialog.Builder alertBuilder = new AlertDialog.Builder(WebViewActivity.this); alertBuilder.setMessage(message); alertBuilder.setTitle("Alert"); alertBuilder.show(); result.confirm(); return true; } //当网页请求地理位置 public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { callback.invoke(origin , true //如果不允许的话,JS请求地理位置会得到error:permission denied by user , false); Toast.makeText(getApplicationContext(), "onGeolocationPermissionsShowPrompt", Toast.LENGTH_LONG).show(); // super.onGeolocationPermissionsShowPrompt(origin, callback); } @Override public void onReceivedTitle(WebView view, String mTitle) { super.onReceivedTitle(view, mTitle); if (TextUtils.isEmpty(mTitle) || mTitle.startsWith("http")) return;//有时候网页端没有设置title会返回url title = mTitle; if (mToolbar != null) { ((TextView) mToolbar.findViewById(R.id.tv_action_title)).setText(mTitle); } } @Override public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) { onShowCustomView(view, callback); } @Override public void onShowCustomView(View view, CustomViewCallback callback) { if (mCustomView != null) { callback.onCustomViewHidden(); return; } mCustomView = view; mWebView.setVisibility(View.GONE); customViewContainer.setVisibility(View.VISIBLE); customViewContainer.addView(view); customViewCallback = callback; } @Override public View getVideoLoadingProgressView() { if (mVideoProgressView == null) { LayoutInflater inflater = LayoutInflater.from(WebViewActivity.this); mVideoProgressView = inflater.inflate(R.layout.video_progress, null); } return mVideoProgressView; } @Override public void onHideCustomView() { if (mCustomView == null) return; mWebView.setVisibility(View.VISIBLE); customViewContainer.setVisibility(View.GONE); mCustomView.setVisibility(View.GONE); customViewContainer.removeView(mCustomView); customViewCallback.onCustomViewHidden(); mCustomView = null; } @Override public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { //需要弹出多窗口的情况。需要自己处理 return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg); } } PopupWindow popWindow; private void initToolbar() { mToolbar = (ViewGroup) findViewById(R.id.toolbar); mToolbar.findViewById(R.id.img_back_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); ((TextView) mToolbar.findViewById(R.id.tv_action_title)).setText(title); if (rightIcon) { mToolbar.findViewById(R.id.right_btn).setVisibility(View.VISIBLE); mToolbar.findViewById(R.id.right_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { popWindow = new PopupWindow(WebViewActivity.this); View mContentView = LayoutInflater.from(WebViewActivity.this).inflate( R.layout.webview_menu_popwindow, null); popWindow.setContentView(mContentView); popWindow.setTouchable(true); mContentView.setFocusable(true); mContentView.setFocusableInTouchMode(true); mContentView.findViewById(R.id.share).setOnClickListener(WebViewActivity.this); mContentView.findViewById(R.id.copy).setOnClickListener(WebViewActivity.this); mContentView.findViewById(R.id.open_in_explore).setOnClickListener(WebViewActivity.this); mContentView.findViewById(R.id.refresh).setOnClickListener(WebViewActivity.this); popWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); popWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); popWindow.setFocusable(true); if (!mIsRightShareBtnDisplay) { mContentView.findViewById(R.id.share).setVisibility(View.GONE); } popWindow.showAsDropDown(mToolbar.findViewById(R.id.right_btn), 0, 25); } }); } } @Override protected void onResume() { super.onResume(); mWebView.onResume(); } @Override protected void onPause() { super.onPause(); mWebView.onPause(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (mCustomView != null) { myWebChromeClient.onHideCustomView(); return true; } if (mWebView.canGoBack()) { mWebView.goBack(); } else { onBackPressed(); } return true; } return super.onKeyDown(keyCode, event); } @Override public void finish() { super.finish(); } @Override public void onDestroy() { if (mWebView != null) { //webview调用destory时,webview仍绑定在Activity上. // 这是由于自定义webview构建时传入了该Activity的context对象,因此需要先从父容器中移除webview,然后再销毁webview. //还可以让webView运行在单独进程中,不用的时候直接system.exit(0) ViewParent parent = mWebView.getParent(); if (parent != null) { //防止内存泄露。 mWebView.clearHistory(); ((ViewGroup) mWebView.getParent()).removeView(mWebView); mWebView.loadUrl("about:blank"); mWebView.stopLoading(); mWebView.setWebChromeClient(null); mWebView.setWebViewClient(null); } mWebView.removeAllViews(); try { mWebView.destroy(); } catch (Exception ex) { ex.printStackTrace(); } } if (mLoginReceiver != null) { LocalBroadcastManager.getInstance(this).unregisterReceiver(mLoginReceiver); } super.onDestroy(); } private JsInterface jsInterface = new JsInterface(); final class JsInterface { //有JavascriptInterface注解的才能被JS调用,防止被注入 @JavascriptInterface public void getLoginData() { runOnUiThread(new Runnable() { @Override public void run() { if (FakeUserCenter.isLogin()) { //调用JS的方法 mWebView.loadUrl("javascript:loginCallBack('" + FakeUserCenter.getId() + "','" + FakeUserCenter.getSSO_TOKEN() + "')"); } else { //login // LoginService.addLetvLoginLayout(WebViewActivity.this); // when success mWebView.loadUrl("javascript:loginCallBack('" + FakeUserCenter.getId() + "','" + FakeUserCenter.getSSO_TOKEN() + "')"); } } }); } @JavascriptInterface public void shareData(final String shareText, final String shareTitle, final String shareContentURL, final String shareIconUrl) { runOnUiThread(new Runnable() { @Override public void run() { try { String cUrl = mWebView.getUrl(); if (TextUtils.isEmpty(cUrl)) { return; } Uri cUri = Uri.parse(cUrl); /*String debug = cUri.getQueryParameter("debug");*/ String whiteKey = cUri.getHost(); if (TextUtils.isEmpty(shareText) || TextUtils.isEmpty(shareTitle) || TextUtils.isEmpty(shareContentURL)) { mWebView.loadUrl("javascript:shareCallBack('0')"); return; } else { mWebView.loadUrl("javascript:shareCallBack('1')"); shareUrl(); } } catch (Exception e) { return; } } }); } } class LoginReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent != null) { String action = intent.getAction(); if (action != null && FakeUserCenter.LOGIN_STATUS_CHANGE_ACTION.equals(action)) { onLoginStatusChanged(); } } } } private LoginReceiver mLoginReceiver; private void onLoginStatusChanged() { if (FakeUserCenter.isLogin()) { mWebView.loadUrl("javascript:loginCallBack('" + FakeUserCenter.getId() + "','" + FakeUserCenter.getSSO_TOKEN() + "')"); } } private void getWebData(final String requestUrl) { new Thread() { @Override public void run() { OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request.Builder() .url(requestUrl) .build(); try { Response response = okHttpClient.newCall(request).execute(); final String data = response.body().string(); runOnUiThread(new Runnable() { @Override public void run() { if (!TextUtils.isEmpty(data)) {//页面销毁之后不做处理 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && !isDestroyed()) { // mWebView.loadData(data, "text/html; charset=UTF-8", null); mWebView.loadDataWithBaseURL(null, data, "text/html", "UTF-8", null); } } } }); } catch (IOException e) { e.printStackTrace(); } } }.start(); } }
功能详细的WebViewActivity
附带给网页端设置登录信息等。
猜你喜欢
转载自ccsosnfs.iteye.com/blog/2392592
今日推荐
周排行